给定的一个n*m的区域内,给出一些点的坐标,这些点上有一个元素,如果在矩形的子矩形的三个点都有元素,那么第四个点的元素可以自己产生,其他的元素需要购买,问最少需要购买多少中元素才可以把这个区域给填满。

对于给出点的,先用并查集把x轴上和y轴上有联系的点都联系起来,并且可以顺便把出现过的x和y的数值标记起来。

如果我把所有的点分成了n块,那么的需要添加n-1个元素来把这n块连接起来。对于没有出现的x和y的数值,我需要额外买一个元素来填充这个点。

因为我已经在一个块内的点一定是有联系的,而另一个块的点一定与这里面的点都没有联系,所以我只需要添加一个元素让他们的 x 或者 y 联系起来,那么这个块一定可以形成一个包含三个点的子矩形,也就可以产生出另一个点的元素。就可以把这些块里出现的x和y的横纵方向填满,这样就会剩下那么没有出现的x和y位置上的点还是空的了,然后同样的也只需要添加一个就可以填满一行或者一列。

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 200005;
const int maxm = 1000005;
const int mod = 10007;
using namespace std;int n, m, tol, T;
int fa[maxn];
int X[maxn];
int Y[maxn];int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);
}void build(int x, int y) {int u = find(x);int v = find(y);fa[v] = u;
}int main() {int q;scanf("%d%d%d", &n, &m, &q);for(int i=1; i<=q; i++)    fa[i] = i;int x, y;for(int i=1; i<=q; i++) {scanf("%d%d", &x, &y);if(X[x])     build(i, X[x]);X[x] = fa[i];if(Y[y])    build(i, Y[y]);Y[y] = fa[i];}ll ans = -1;for(int i=1; i<=q; i++)find(i);for(int i=1; i<=q; i++)if(fa[i] == i)    ans++;for(int i=1; i<=n; i++)if(!X[i])    ans++;for(int i=1; i<=m; i++)if(!Y[i])    ans++;printf("%I64d\n", ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9396860.html

Chemical table CFR500 div2D(并查集)相关推荐

  1. codeforces1012 B. Chemical table(并查集+思维)

    B. Chemical table One of the way to solve this problem is to interprete the cells in 2d matrix as an ...

  2. 【牛客 - 1080B】tokitsukaze and Hash Table(STLset,并查集,Hash)

    题干: 链接:https://ac.nowcoder.com/acm/contest/1080/B 来源:牛客网 tokitsukaze有n个数,需要按顺序把他们插入哈希表中,哈希表的位置为0到n-1 ...

  3. cf 1012B Chemical table

    思路: 对我这种新手来说挺难想到的并查集吧,好歹看了题解能明白了 每一行和每一列都看成并查集中的一个点,所以一共有n+m个点, 可以看出,只要一个矩形只要三个角上的点有共同的祖先,那么第四个点的x和y ...

  4. 暑期集训5:并查集 线段树 练习题B: HDU - 1213 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题B  --   HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...

  5. hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)

    点击打开链接 C - How Many Tables Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  6. HD 1213 How Many Tables(裸 并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. ...

  7. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  8. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  9. hdu1213 How Many Tables-并查集

    Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...

最新文章

  1. 建立于因果推理与机器学习共识的稳定学习
  2. 推荐10款Windows系统必备的高效软件!!!
  3. select子句顺序
  4. 海洋分享皮肤_最稀有的军需皮肤,外号第一代身法套,如今都进了素材包
  5. es6在原生代码的用法_关于ES6的模块化
  6. peewee flask pwiz 中使用模型 过一段时间报错 peewee.InterfaceError: (0, '') 的解决方式
  7. (转)Blend操作入门: 别站在门外偷看,快进来吧!
  8. java怎么不增加临时变量交换值
  9. 【测试面试题】控制体重
  10. 营收948亿却输掉起跑线,5G的时代中国电信如何跑赢
  11. 【Hadoop Summit Tokyo 2016】LLAP:Hive上的次秒级分析查询
  12. linux下的C语言开发(gdb调试)
  13. 狂雨小说采集规则(书趣阁3000页)
  14. SiamFC论文解读及代码实现
  15. easyBCD修改系统启动项
  16. 吉首 - 傻鸡抓大闸蟹
  17. 今年最后一月数据库排名公布!前三难以撼动!
  18. 可怕!9岁男孩为买任天堂游戏机,竟然...
  19. 山东法律学校97级计算机班,我校计算机学院97级计算机专业校友重聚母校
  20. 【超级干货】Delphi轮播视频和图片程序(用于双屏显示程序)

热门文章

  1. C/C++ 变量的初始化
  2. mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet
  3. 【转】聊聊HTTPS和SSL/TLS协议
  4. Java连接SQLite数据库
  5. pushbox(1)
  6. js 内置对象的方法
  7. 闭包的理解、缺点以及应用场景
  8. Software Project Management之EVM问题的求解
  9. 数据库原理—SQL数据定义功能(九)
  10. ES6学习(八)—Promise对象 超鸡重要