[JSOI2008]星球大战starwar
来源:互联网 发布:windows桌面闹钟 编辑:程序博客网 时间:2024/06/05 05:23
Description
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
Input
输入文件第一行包含两个整数,N (1 < = N < = 2M) 和M (1 < = M < = 200,000),分别表示星球的数目和以太隧道的数目。星球用 0 ~ N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0 < = X <> Y 表示星球x和星球y之间有“以太”隧道,可以直接通讯。接下来的一行为一个整数k,表示将遭受攻击的星球的
数目。接下来的k行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这k个数互不相同,且都在0到n-1的范围内。
Output
输出文件的第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
Sample Input
8 130 11 66 55 00 61 22 33 44 57 17 27 63 6516357
Sample Output
111233
很容易想到是离线下然后并查集,但是每次加边的时候就是没想到怎么快速的处理加哪条边,于是开始翻题解,恍然大悟233,只要开始建好边,然后记录下每个点当前是否在图上就好了。
代码如下
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int tot = 1;const int size = 2000100;int head[size],next[size],l[size];void build(int f,int t){ l[tot] = t; next[tot] = head[f]; head[f] = tot ++;}bool use[size];int p[size];int n,m,k;bool vis[size];int cut;int ans[size];int f[size];int find(int x){ if(f[x] == x) return x; return f[x] = find(f[x]);}void dfs(int u){ for(int i = head[u] ; i ; i = next[i]) { int t = l[i]; if(use[t]) { int ff = find(u) , ft = find(t); if(ff != ft) { f[ff] = ft; cut --; } } }}int main(){ scanf("%d%d",&n,&m); cut = n; for(int i = 1 ; i <= n ; i ++) f[i] = i; for(int i = 1 ; i <= m ; i ++) { int f,t; scanf("%d%d",&f,&t); f ++ , t ++; build(f,t); build(t,f); } scanf("%d",&k); cut -= k; for(int i = 1 ; i <= k ; i ++) { scanf("%d",&p[i]); p[i] ++; vis[p[i]] = 1; } for(int i = 1 ; i <= n ; i ++) if(!vis[i]) dfs(i) , use[i] = 1; ans[k + 1] = cut; for(int i = k ; i >= 1 ; i --) { cut ++; dfs(p[i]); use[p[i]] = 1; ans[i] = cut; } for(int i = 1 ; i <= k + 1 ; i ++) printf("%d\n",ans[i]); return 0;}
- 【BZOJ1015】[JSOI2008]星球大战starwar
- bzoj1015[JSOI2008]星球大战starwar
- bzoj1015: [JSOI2008]星球大战starwar
- 1015: [JSOI2008]星球大战starwar
- [BZOJ1015][JSOI2008]星球大战starwar
- [BZOJ1015] [JSOI2008]星球大战starwar
- [BZOJ1015][JSOI2008]星球大战starwar
- 【BZOJ1015】【JSOI2008】星球大战starwar
- [bzoj1015][JSOI2008]星球大战starwar
- bzoj1015: [JSOI2008]星球大战starwar
- [JSOI2008]星球大战starwar
- 【BZOJ1015】【JSOI2008】星球大战starwar
- 【bzoj1015】[JSOI2008]星球大战starwar
- 【bzoj1015】[JSOI2008]星球大战starwar
- [JSOI2008]星球大战starwar
- [JSOI2008]星球大战StarWar
- [JSOI2008]星球大战starwar
- bzoj1015: [JSOI2008]星球大战starwar
- 使用 Bootstrap 另一个创建响应式设计的方法,是使用现成的 CSS 框架。
- 自己整理的一个Android数据库工具框架
- easyui的基本练习
- 设计模式与设计原则
- 如何画数据流图(DFD)?
- [JSOI2008]星球大战starwar
- 如何入门微信小程序开发
- 升级到Xcode8和ios10.0的时候调用相机崩溃
- 数据类型之结构体
- 自己做个记录,搬运一篇RxJava的操作符
- Filter及FilterChain的使用详解
- matlab 事件机制
- Android 获取手机中微信聊天记录
- imagepicker(图片选择器)