【并查集】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;}


热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 12123地理反编码失败怎么办 苹果手机地理反编码失败怎么办 城管执法过程被打怎么办 老婆看不起老公不让碰怎么办 老婆总不让碰该怎么办 机动车扣满12分怎么办 吊车吊运货物失控应该怎么办 车辆违章扣6分怎么办 最新交通法扣满12分怎么办 违章停车单丢了怎么办 违停告知单掉了怎么办 违章停车扣3分怎么办 驾驶证被扣12分怎么办 被贴条了条丢了怎么办 车停路边连续几天被贴条怎么办 车停在路边限号怎么办 违停的罚单丢了怎么办 借道左转红灯了 怎么办 道路上有锯齿线标志怎么办 被领导臭骂了一顿怎么办 酒驾撞了人逃跑怎么办处理 荣耀9home键掉了怎么办 今天开车把老太婆撞了怎么办 交通责任认定书不合理怎么办 交通事故救济金用了 没钱还怎么办 车脏了洗不干净怎么办 衣服上贴花掉了怎么办 衣服上的画掉了怎么办 衣服上沾了胶怎么办 补鞋胶弄衣服上怎么办 摩托车大灯里面掉漆怎么办 行驶中轮胎爆胎怎么办 左拐车道直行了怎么办 踏板摩托车淋雨打不着火怎么办 购房小蓝本丢了怎么办 3d下载模型没颜色怎么办 车辆被扣30分怎么办 驾驶证被扣15分怎么办 驾驶本被扣分了怎么办 违章扣分扣错了怎么办 出国自驾游怎么办手续