BZOJ_1015_星球大战_[JSOI2008]_(并查集)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1015
n 个点,被 m 条边相连.进行k次删点操作,问第一次操作前和每次操作后的集合数(直接或间接连在一起的点属于同一个集合).
1015: [JSOI2008]星球大战starwar
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 4696 Solved: 2114
[Submit][Status][Discuss]
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
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7
Sample Output
1
1
2
3
3
HINT
Source
分析
离线处理,先把所有点都删掉,建立并查集,统计集合数,这就是最后一个答案,然后加上最后一个被删掉的点,这就是倒数第二个答案,以此类推,直到将所有点都加回去,就是进行删除操作前的答案.
怎么统计集合数呢?每来一个点,集合数 tot ++ ,如果发现有可以合并的集合,那就合并集合,并 tot -- .
#include<cstdio>
#include<algorithm>
#include<vector>
#define read(a) a=getnum()
using namespace std; const int maxm=,maxn=;
int n,m,k;
int f[maxn],q[maxn],ans[maxn];
bool mark[maxn];
vector <int> g[maxn]; inline int getnum(){int ret=,k=;char c;for(c=getchar();c<''||c>'';c=getchar()) if(c=='-') k=-;for(;c>=''&&c<='';c=getchar()) ret=ret*+c-''; return ret*k;} int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } void unite(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy) f[fx]=fy;
} void update(int x,int &tot)
{
mark[x]=false;
for(int i=;i<g[x].size();i++)
{
int y=g[x][i];
if(mark[y]) continue;
if(find(x)!=find(y))
{
unite(x,y);
tot--;
}
}
} void solve()
{
for(int i=;i<=n;i++) f[i]=i;
int tot=;
for(int i=;i<=n;i++)
{
if(mark[i]) continue;
tot++;
update(i,tot);
}
ans[k]=tot;
for(int i=k;i>=;i--)
{
tot++;
update(q[i],tot);
ans[i-]=tot;
}
for(int i=;i<=k;i++) printf("%d\n",ans[i]);
} void init()
{
read(n); read(m);
for(int i=;i<=m;i++)
{
int a,b;
read(a); read(b);
a++; b++;
g[a].push_back(b);
g[b].push_back(a);
}
read(k);
for(int i=;i<=k;i++)
{
read(q[i]);
q[i]++;
mark[q[i]]=true;
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("star.in","r",stdin);
freopen("star.out","w",stdout);
#endif
init();
solve();
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("star.out");
#endif
return ;
}
BZOJ_1015_星球大战_[JSOI2008]_(并查集)的更多相关文章
- BZOJ 1016 星球大战starwar(逆向-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们 ...
- BZOJ_1015_[JSOI2008]星球大战_并查集
BZOJ_1015_[JSOI2008]星球大战_并查集 题意:很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器, ...
- BZOJ1015[JSOI2008]星球大战starwar[并查集]
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ...
- [1015][JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2124 Solved: 909[Submit] ...
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3895 Solved: 1750[Submit ...
- BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集
BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- 并查集【洛谷P1197】 [JSOI2008]星球大战
P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系 ...
随机推荐
- SQLServer实现split分割字符串到列
网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题. 先贴上某大牛写的sp ...
- 10_Mybatis开发Dao方法——mapper代理实现
[工程截图(几个关键的标红框)] [UserMapper.xml] <?xml version="1.0" encoding="UTF-8"?> & ...
- C# 调用 MFC DLL
创建项目 创建MFCDLL项目 MFC项目中这么声明 生成dll工程 可以看到库文件的生成目录,保存下来 创建测试用c#项目 我们创建一个按钮调用我们刚才的函数 这边这么调用MFC库的函数入口.这里并 ...
- PHP - php汉字转拼音
php汉字转拼音 php函数(由dedecms(dedecms/include/inc/inc_fun_funAdmin.php)的SpGetPinyin函数修改,dedecms的字典不太完全): & ...
- [python]filter
- LayoutInflater的获取与使用
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- 从 IT 的角度思考 BIM(一):面向对象
还记得那个笑话吗:要把大象放进冰箱,总共分几步?这不仅仅是一个笑话,还是一个值得我们好好分析的笑话. 如果要放进冰箱的是一个苹果,那么也就不可笑了,但换成大象,就引起了我们的兴趣和注意,为什么? 我们 ...
- Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker)
Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker) 一.准备工作 1.Eclipse Java EE IDE(4.4.1) 2.JDK 3.Tomc ...
- SVN - 配置
版本控制器 1.创建文件夹 svn 2.打开终端 进入该文件夹 3.输入 svnadmin 如果有错 xcrun: error: active developer path ("/Appli ...
- struts2简介
MVC框架.不过有一点需要注意的是:struts2和struts2虽然名字很相似,但是在两者在代码编写风格上几乎是不一样的.那么既然有了struts1,为什么还要推出struts2.主要的原因是str ...