CodeForces 292D Connected Components(并查集 前后缀)
来源:互联网 发布:阿芙护肤品怎么样知乎 编辑:程序博客网 时间:2024/04/30 12:05
题意:给你n个点,m条边,现在q次询问,每次询问给你一个l, r, 问你删除第l至r条边后,连通块的数量。(每次询问
之后又把所有边加上) n < 100, m < 1e4, q < 2e4
思路:想着暴力或是对询问区间进行排序再去操作,复杂度都很高,显然不行。每次询问是把一段区间的边删去,所
以我们可以预处理出 1~i 和 j~m 条边构成的并查集,这样空间复杂度1e4*100,可以满足,每次询问,合并一下1~l-1
和r+1~m这两个并查集,就能求得答案。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 5e2+5;const int maxm = 1e4+5;int preL[maxm][maxn], preR[maxm][maxn], preTmp[maxn];int u[maxm], v[maxm], n, m;int Find(int *pre, int x){ int r = x; while(pre[r] != r) r = pre[r]; int i = x, j; while(i != r) { j = pre[i]; pre[i] = r; i = j; } return r;}void join(int *pre, int x, int y){ int a = Find(pre, x); int b = Find(pre, y); if(a != b) pre[b] = a;}void init(){ for(int i = 1; i <= n; i++) preL[0][i] = preR[0][i] = preL[m+1][i] = preR[m+1][i] = i; for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) preL[i][j] = preL[i-1][j]; join(preL[i], u[i], v[i]); } for(int i = m; i >= 1; i--) { for(int j = 1; j <= n; j++) preR[i][j] = preR[i+1][j]; join(preR[i], u[i], v[i]); }}int cal(int l, int r){ for(int i = 1; i <= n; i++) preTmp[i] = preL[l-1][i]; for(int i = 1; i <= n; i++) join(preTmp, preL[l-1][i], preR[r+1][i]); int ans = 0; for(int i = 1; i <= n; i++) if(i == Find(preTmp, i)) ans++; return ans;}int main(void){ while(cin >> n >> m) { for(int i = 1; i <= m; i++) scanf("%d%d", &u[i], &v[i]); init(); int q; scanf("%d", &q); while(q--) { int l, r; scanf("%d%d", &l, &r); printf("%d\n", cal(l, r)); } } return 0;}
阅读全文
1 0
- CodeForces 292D Connected Components(并查集 前后缀)
- Codeforces 292D Connected Components (并查集)
- CodeForces 292D Connected Components (并查集+YY)
- Codeforces 292D [Connected Components]--并查集的巧妙应用
- CodeForces 292D Connected Components(变种并查集+预处理)
- Codeforces-292D:Connected Components(m个并查集)
- Codeforces 292D. Connected Components
- 前缀并查集 Codeforces292D Connected Components
- CF292D Connected Components【并查集】
- Codeforces292D Connected Components 经典好题并查集
- 2017多校训练第二周-Connected Components-并查集
- 中国(北方)大学生程序设计训练赛(第二周)(Problem G: Connected Components-并查集)
- Connected Component 并查集
- Croc Round1 D Connected Components
- cf 209 D. Connected Components
- Codeforces 292D (并查集巧妙运用)
- Codeforces 366D 贪心+并查集
- Codeforces 371D. Vessels【并查集】
- springmvc(四) springmvc的数据校验的实现
- 用caffe训练测试自己的图片
- C++const对象 常量数据 常量成员函数 const指针 const引用
- B
- 什么是轻量级,什么是重量级。-----框架
- CodeForces 292D Connected Components(并查集 前后缀)
- 我的开发世界-聊聊前端(一)
- Java基础之字符串
- 【笨鸟先飞】android重新学习日记2---组件
- 像素翻转
- loadrunner结果分析总结
- 在Java中,如何跳出多重循环
- 敏捷开发团队管理系列
- 以太坊生产网络/测试网络/私有网络