Chemical table CFR500 div2D(并查集)
给定的一个n*m的区域内,给出一些点的坐标,这些点上有一个元素,如果在矩形的子矩形的三个点都有元素,那么第四个点的元素可以自己产生,其他的元素需要购买,问最少需要购买多少中元素才可以把这个区域给填满。
对于给出点的,先用并查集把x轴上和y轴上有联系的点都联系起来,并且可以顺便把出现过的x和y的数值标记起来。
如果我把所有的点分成了n块,那么的需要添加n-1个元素来把这n块连接起来。对于没有出现的x和y的数值,我需要额外买一个元素来填充这个点。
因为我已经在一个块内的点一定是有联系的,而另一个块的点一定与这里面的点都没有联系,所以我只需要添加一个元素让他们的 x 或者 y 联系起来,那么这个块一定可以形成一个包含三个点的子矩形,也就可以产生出另一个点的元素。就可以把这些块里出现的x和y的横纵方向填满,这样就会剩下那么没有出现的x和y位置上的点还是空的了,然后同样的也只需要添加一个就可以填满一行或者一列。
![](/assets/blank.gif)
![](/assets/blank.gif)
#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(并查集)相关推荐
- 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 ...
- 【牛客 - 1080B】tokitsukaze and Hash Table(STLset,并查集,Hash)
题干: 链接:https://ac.nowcoder.com/acm/contest/1080/B 来源:牛客网 tokitsukaze有n个数,需要按顺序把他们插入哈希表中,哈希表的位置为0到n-1 ...
- cf 1012B Chemical table
思路: 对我这种新手来说挺难想到的并查集吧,好歹看了题解能明白了 每一行和每一列都看成并查集中的一个点,所以一共有n+m个点, 可以看出,只要一个矩形只要三个角上的点有共同的祖先,那么第四个点的x和y ...
- 暑期集训5:并查集 线段树 练习题B: HDU - 1213
2018学校暑期集训第五天--并查集 线段树 练习题B -- HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...
- hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)
点击打开链接 C - How Many Tables Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- HD 1213 How Many Tables(裸 并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. ...
- NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...
- 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...
hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...
- hdu1213 How Many Tables-并查集
Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...
最新文章
- 建立于因果推理与机器学习共识的稳定学习
- 推荐10款Windows系统必备的高效软件!!!
- select子句顺序
- 海洋分享皮肤_最稀有的军需皮肤,外号第一代身法套,如今都进了素材包
- es6在原生代码的用法_关于ES6的模块化
- peewee flask pwiz 中使用模型 过一段时间报错 peewee.InterfaceError: (0, '') 的解决方式
- (转)Blend操作入门: 别站在门外偷看,快进来吧!
- java怎么不增加临时变量交换值
- 【测试面试题】控制体重
- 营收948亿却输掉起跑线,5G的时代中国电信如何跑赢
- 【Hadoop Summit Tokyo 2016】LLAP:Hive上的次秒级分析查询
- linux下的C语言开发(gdb调试)
- 狂雨小说采集规则(书趣阁3000页)
- SiamFC论文解读及代码实现
- easyBCD修改系统启动项
- 吉首 - 傻鸡抓大闸蟹
- 今年最后一月数据库排名公布!前三难以撼动!
- 可怕!9岁男孩为买任天堂游戏机,竟然...
- 山东法律学校97级计算机班,我校计算机学院97级计算机专业校友重聚母校
- 【超级干货】Delphi轮播视频和图片程序(用于双屏显示程序)
热门文章
- C/C++ 变量的初始化
- mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet
- 【转】聊聊HTTPS和SSL/TLS协议
- Java连接SQLite数据库
- pushbox(1)
- js 内置对象的方法
- 闭包的理解、缺点以及应用场景
- Software Project Management之EVM问题的求解
- 数据库原理—SQL数据定义功能(九)
- ES6学习(八)—Promise对象 超鸡重要