[洛谷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 ...
随机推荐
- java--计时器
计时器 一.窗口化 public class Pro extends JFrame{ private JTextField textField = new JTextField(45);//系统时间文 ...
- UWP:可滚动的PivotHeader
UWP开发里,Pivot真是个令人又爱又恨的控件.为了实现某些可滚动Header的效果,有些大佬甚至去掉了原本的Header,使用一个ListView或者ListBox自己画Header,不过这样会让 ...
- AngularJS复习------表单验证
在AngularJS中能够将HTML5表单验证功能同自己的验证指令结合起来使用,这里介绍使用的核心功能. 使用表单验证,首先要确保表单的每个控件都有name属性 如果想要屏蔽浏览器对表单的默认验证行为 ...
- 【Python】 sys和os模块
sys sys模块能使程序访问于python解释器联系紧密的变量和函数 ● sys中的一些函数和变量 argv 命令行参数构成的列表 path 查找所有可用模块所在的目录名的列表 platform 查 ...
- [poj3252]Round Numbers_数位dp
Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...
- ReentrantLock 与 AQS 源码分析
ReentrantLock 与 AQS 源码分析 1. 基本结构 重入锁 ReetrantLock,JDK 1.5新增的类,作用与synchronized关键字相当,但比synchronized ...
- 冲刺NO.6
Alpha冲刺第六天 站立式会议 项目进展 项目中学生基本信息管理,与系统管理员模块基本完成,团队开始编写学生信用信息模块内容与奖惩事务管理内容,准备开始对已完成模块进行测试. 问题困难 团队成员对前 ...
- 《Language Implementation Patterns》之 增强解析模式
上一章节讲述了基本的语言解析模式,LL(k)足以应付大多数的任务,但是对一些复杂的语言仍然显得不足,已付出更多的复杂度.和运行时效率为代价,我们可以得到能力更强的Parser. Pattern 5 : ...
- 在Windows上安装「算法 第四版」组件
这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这 ...
- 超绚丽CSS3多色彩发光立方体旋转动画
CSS3添加了几个动画效果的属性,通过设置这些属性,可以做出一些简单的动画效果而不需要再去借助JavaScript.css3动画的属性主要分为三类:transform.transition以及anim ...