【并查集】Filling
来源:互联网 发布:以下哪件商品能在淘宝上发布 编辑:程序博客网 时间:2024/06/06 16:31
矩形填补 (Filling.pas/c/cpp/in/out) (Scores:5*20) 【题目描述】 给定平面 n 个黑点,如果平面一个边平行于坐标轴的矩形 3 个角是黑色的那么就把那个矩形的第 4 个角改成黑色,最后平面上将会有多少个黑点 【输入格式】 第一行一个整数 n (30%的数据 n<=100,100%的数据 n<=200000),表示最初有 n个点 接下来 n 行,每行两个整数 xi,yi (绝对值<=10^9),表示第 i 个点的坐标 【输出格式】 一个整数,表示最后有多少个点
相当经典的并查集题。
模型转换:
考虑任意一个新增的点,由题,其横坐标、纵坐标一定都是已经存在的X坐标,Y坐标。
但是不是所有满足上面的条件的都可以。
我们将x坐标相同的点合并为集合,
再把y坐标相同的点所在的集合合并,
那么这个集合中原有点的个数+新点的个数就是该集合中(x坐标的种类)*(y坐标的种类)
那么怎么维护这些种类呢?
我们先考虑只维护x的。
显而易见排序+并查集。
怎么同时维护y的呢?
再次排序,按y相同合并原集合。
然后,由于y相同的都合并了,所以相同的y必然只存在于一个集合中。
那么,在所有y相同的点中,任取一个,将其所在集合的代表元的y种类计数变量 + 1 即可。
Source:
#include<cstdio> #include<algorithm>#include<climits>#ifdef WIN32#define ot "%I64d"#else#define ot "%lld"#endif#define maxn 2000005using namespace std;int n, f[maxn], cx[maxn], cy[maxn];struct point{int x, y, n;}a[maxn];void init(){freopen("filling.in", "r", stdin);freopen("filling.out", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d%d", &a[i].x, &a[i].y), a[i].n = i;}bool cmp(point a, point b){return a.x < b.x;}bool cmp2(point a, point b){return a.y < b.y;}int find(int k){if (f[k] != k) f[k] = find(f[k]);return f[k];}int main(){init();sort(a + 1, a + n + 1, cmp);f[a[1].n] = a[1].n; cx[a[1].n] = 1;for (int i = 2; i <= n; i++)if (a[i].x == a[i - 1].x) f[a[i].n] = f[a[i - 1].n];elsef[a[i].n] = a[i].n, cx[a[i].n] = 1;sort(a + 1, a + n + 1, cmp2);for (int i = 2; i <= n; i++)if (a[i].y == a[i - 1].y){int f1 = find(a[i - 1].n), f2 = find(a[i].n);if (f1 != f2){f[f1] = f2; cx[f2] += cx[f1];}}++cy[find(a[1].n)];long long ans = 0;for (int i = 2; i <= n; i++)if (a[i].y != a[i - 1].y) ++cy[find(a[i].n)];for (int i = 1; i <= n; i++)if (f[i] == i) ans += (long long)cx[i] * cy[i];printf(ot, ans);return 0;}
- 【并查集】Filling
- Filling
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- SQL SERVER实用经验技巧集
- 黑马程序员-面试题之交通灯
- 北京实习总结——记住牛人那些话
- 组件之动态链接库
- 僵尸进程和孤儿进程
- 【并查集】Filling
- HTML <a>标签中锚点(anchor)的使用
- JavaWeb的各种中文乱码终极解决方法
- 对Hibernate进行优化的方案
- symbian os :TFileText 读写文本的实例
- Vmware Workstation 9.0安装Windows Server 2012并实现虚拟化嵌套功能安装Hyper-v 3.0
- 堆栈、栈帧与函数调用过程分析
- poj 2057 The Lost House
- 【javascript】不刷新页面,实时显示当前时间