[洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块
Description
- 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。
但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
Input&Output
Input
- 输入文件第一行包含两个整数,N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。
- 接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y<N),表示星球X和星球Y之间有以太隧道。注意所有的以太隧道都是双向的。
- 接下来一行是一个整数K,表示帝国计划打击的星球个数。
- 接下来的K行每行一个整数X,满足0<=X<N,表示帝国计划打击的星球编号。帝国总是按输入的顺序依次摧毁星球的。
Output
- 输出文件的第一行是开始时星球的连通块个数。
- 接下来的K行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
Solution
- 这道题如果按照输入顺序操作,就要支持联通块的拆分,数据规模显然不允许。由于过程是离线的,我们可以考虑倒序操作,对联通块实施重建。
- 先记录每次打击的目标,维护一个vis数组,记录该星球是否属于反抗军,同时每打击一个星球,联通块个数-1。
- 在进行重建前先检查是否有仍属于反抗军的星球,通过邻接表遍历边,对于两个端点vis都为假的星球,实施重建,否则压入集合。在合并联通块的同时维护联通块个数。
- 检查后开始倒序操作,每次处理前记录第i次打击后联通块个数。需要注意,每恢复一个星球,在恢复下一个星球前应当有联通块总数+1,因为我们向反抗军集合中加入了一个星球。
重建完毕后,在res[0]中记录sum,这是打击前的联通块个数。输出。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #define maxn 400005 using namespace std; int n,m,k,x,y,fa[maxn],sum,op[maxn],res[maxn]; int lnk[maxn],edgenum; bool vis[maxn],lone[maxn]; vector<vector<int> > s(maxn); struct edge{ int to,nxt; }e[maxn]; void add(int x,int y) { edgenum++; e[edgenum].to=y; e[edgenum].nxt=lnk[x]; lnk[x]=edgenum; } int find(int x) { if(x==fa[x])return x; return fa[x]=find(fa[x]); } void link(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy)fa[fx]=fy,sum--; } int main() { scanf("%d%d",&n,&m); sum=n; for(int i=0;i<n;++i)fa[i]=i; for(int i=1;i<=m;++i) { scanf("%d%d",&x,&y); add(x,y); add(y,x); } scanf("%d",&k); for(int i=1;i<=k;++i)scanf("%d",&op[i]),sum--,vis[op[i]]=true; for(int i=0;i<n;++i) { for(int p=lnk[i];p;p=e[p].nxt) { int y=e[p].to; if(!vis[i]&&!vis[y])link(i,y); else s[i].push_back(y),s[y].push_back(i); } } for(int i=k;i>0;--i){ vis[op[i]]=false; res[i]=sum; for(int j=0;j<s[op[i]].size();++j) if(!vis[s[op[i]][j]])link(op[i],s[op[i]][j]); sum++; } res[0]=sum; for(int i=0;i<=k;++i)printf("%d\n",res[i]); return 0; }
[洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块的更多相关文章
- bzoj1015: [JSOI2008]星球大战starwar 并查集+离线处理
题目传送门 这道题可以改为离线处理 倒着找答案 这样删点就变成加点了 有了这个思想题目就很好写了哇 23333 #include<cstdio> #include<cstring&g ...
- BZOJ1015[JSOI2008]星球大战starwar[并查集]
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ...
- P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
- 并查集【洛谷P1197】 [JSOI2008]星球大战
P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系 ...
- BZOJ_1015_[JSOI2008]星球大战_并查集
BZOJ_1015_[JSOI2008]星球大战_并查集 题意:很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器, ...
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3895 Solved: 1750[Submit ...
- [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6849 Solved: 3204[Submit ...
- 星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ...
随机推荐
- 云计算---openstack实例共享80、443端口
前言 因为openstack使用的是apache,所以不能共享80端口,但创建的许多云主机,虽然可以通过rinetd进行跳转,但有时需要直接访问80端口,所以这里我们选择包含了nginx的openre ...
- IPFS家族(一)
IPFS这个项目其实很大,并不像大家想象的是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页.让我们来简单看一下IPFS家族成员. 协议实验室的主页:https: ...
- MySQL 中如何存储 emoji ?
MySQL 中如何存储 emoji ? 问题还原 使用 erlang 存储一些特殊字符串到 MySQL 的时候,却没法读出来.经检查,这些字符串的二进制格式如下: <<240,159,15 ...
- 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django
0.准备工作 在一台全新的服务器中新建用户以及用户的工作目录,之后的操作都以这个用户的身份进行,而不是直接用root. 举个栗子: 在服务器下新建用户rinka并赋予sudo权限 1) root登陆, ...
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...
- 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- 网站加速与Linux服务器防护
网站加速方面 1. Nginx 配置 gzip 压缩 开启nginx gzip压缩后,网页.css.js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验.虽然会消耗c ...
- 攻防组网之—-MikroTik软路由的配置和FUZZ
作者:红发香克斯 开篇之前一直想借助一台高性能PC利用VMWare组建一个攻防网络,之前有一贴写过找到了一个软路由系统,就是可以在VMWare中使用的路由器操作系统,那个系统还挺常用,上次帖子写到了安 ...
- C# MVC NPOI导出
前台: <form id="fmexp" method="post" target="_blank"> </form> ...
- [BZOJ 1297][SCOI2009]迷路
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1418 Solved: 1017[Submit][Status ...