[bzoj 1015] [JSOI2008]星球大战starwar:并查集,离线
2016-09-27 21:13
447 查看
题意:有一个无向图,点数、边数在十万级别。依次删掉一些顶点,问初始时、每删掉一个点后连通块的数目。
并查集擅长维护连通性。每连接两个不同的连通块,连通块数目就减1。不过,这里是删点而不是加边,还能用并查集吗?
离线处理,倒过来就好了。
去年写开车旅行,事先知道要用倍增,然而卡在了怎样找东边最近、次近的城市。搞了一个很复杂的大根堆做法,TLE。一边写,我一边想,光建图我就写了两个小时,当年vfk是怎么AC的啊……WZH学长看了题解,说用set就好,可是我还是不知道怎样保证找到的是东边的点。答案是倒过来,自东向西插点。我还是too naive……
但是贺神犇听了题意之后5秒钟就回答倒过来插点Orz 他说是受到黑书上一道并查集的启发。正过来看什么也不是,倒过来看就是并查集了。不知道贺神犇指的是不是这道并查集呢?
并查集擅长维护连通性。每连接两个不同的连通块,连通块数目就减1。不过,这里是删点而不是加边,还能用并查集吗?
离线处理,倒过来就好了。
去年写开车旅行,事先知道要用倍增,然而卡在了怎样找东边最近、次近的城市。搞了一个很复杂的大根堆做法,TLE。一边写,我一边想,光建图我就写了两个小时,当年vfk是怎么AC的啊……WZH学长看了题解,说用set就好,可是我还是不知道怎样保证找到的是东边的点。答案是倒过来,自东向西插点。我还是too naive……
但是贺神犇听了题意之后5秒钟就回答倒过来插点Orz 他说是受到黑书上一道并查集的启发。正过来看什么也不是,倒过来看就是并查集了。不知道贺神犇指的是不是这道并查集呢?
#include <cstdio> #include <algorithm> using namespace std; const int MAX_M = 200000, MAX_N = 2*MAX_M; int e_ptr = 1, root[MAX_N], head[MAX_N], q[MAX_N], a[MAX_N]; bool mark[MAX_N]; struct Edge { int v, next; } E[1+MAX_M*2]; inline void add_edge(int u, int v) { E[e_ptr] = (Edge){v, head[u]}; head[u] = e_ptr++; } int get_root(int x) { return x == root[x] ? x : root[x] = get_root(root[x]); } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < m; ++i) { int x, y; scanf("%d %d", &x, &y); add_edge(x, y); add_edge(y, x); } int k; scanf("%d", &k); for (int i = 0; i < n; ++i) { mark[i] = true; root[i] = i; } for (int i = 0; i < k; ++i) { scanf("%d", &q[i]); mark[q[i]] = false; } int ans = n-k; for (int u = 0, x, y; u < n; ++u) { x = get_root(u); if (mark[u]) for (int i = head[u], v; v = E[i].v, i; i = E[i].next) if (mark[v] && x != (y = get_root(v))) { --ans; root[y] = x; } } for (int i = k-1, u, x, y; i >= 0; --i) { a[i] = ans++; u = q[i]; mark[u] = true; x = get_root(u); for (int j = head[u], v; v = E[j].v, j; j = E[j].next) if (mark[v] && x != (y = get_root(v))) { --ans; root[y] = x; } } printf("%d\n", ans); for (int i = 0; i < k; ++i) printf("%d\n", a[i]); return 0; }
相关文章推荐
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集 离线维护
- BZOJ1015: [JSOI2008]星球大战starwar 并查集 离线处理
- bzoj 1015: [JSOI2008]星球大战starwar 并查集+离线处理
- [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)
- BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)
- BZOJ 1015: [JSOI2008]星球大战starwar( 并查集 )
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
- bzoj1015: [JSOI2008]星球大战starwar(并查集+倒推)
- _bzoj1015 [JSOI2008]星球大战starwar【并查集】
- 1015: [JSOI2008]星球大战starwar 离线并查集
- 【并查集】bzoj1015 [JSOI2008]星球大战starwar
- bzoj 1015: [JSOI2008]星球大战starwar 并查集
- 【bzoj 1015】[JSOI2008]星球大战starwar(并查集)
- 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)
- bzoj1015 [JSOI2008]星球大战starwar 并查集
- 并查集——BZOJ1015 [JSOI2008]星球大战starwar
- 【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】
- 【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】
- bzoj1015: [JSOI2008]星球大战starwar(并查集)
- bzoj1015: [JSOI2008]星球大战starwar(并查集)