并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197
题解:
坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年。。
并查集不支持拆开(但是可以撤销合并),只支持合并。所以把询问离线了,从最后状态到初状态开始一个个往当前图里加点。
CZL:对于只有删除点/边而不增加点/边,且允许离线的题,可以考虑时光倒流,先建出最终情况,再倒着把点/边加回去。
代码:
#include<cstdio>
using namespace std;
inline int rd(){
int x=; char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x;
}
const int maxn=4e5+,maxm=2e5+;
int N,M,fa[maxn],QUE[maxn],num_edge=,edge_head[maxn];
int u,v,K,cnt=,f1,f2,ans[maxn];
bool atkd[maxn];
struct Edge{ int to,nx; }edge[maxm<<];
inline void Add_edge(int from,int to){
edge[++num_edge].nx=edge_head[from];
edge[num_edge].to=to;
edge_head[from]=num_edge;
return;
}
inline int getf(int n){
if(fa[n]==n) return n;
fa[n]=getf(fa[n]);
return fa[n];
}
int main(){
N=rd(); M=rd();
for(int i=;i<N;i++) fa[i]=i;
for(int i=;i<=M;i++){
u=rd(); v=rd();
Add_edge(u,v);
Add_edge(v,u);
f1=getf(u); f2=getf(v);
if(f1!=f2) fa[f1]=f2;
}
for(int i=;i<N;i++){
if(fa[i]==i) ans[]++;
fa[i]=i;
}
K=rd();
for(int i=;i<=K;i++){
QUE[i]=rd();
atkd[QUE[i]]=;
}
for(int i=;i<N;i++)
if(atkd[i]==){
for(int j=edge_head[i];j;j=edge[j].nx){
int y=edge[j].to;
if(atkd[y]) continue;
f1=getf(i); f2=getf(y);
if(f1!=f2) fa[f1]=f2;
}
}
for(int i=;i<N;i++)
if(atkd[i]==&&fa[i]==i) cnt++;
for(int k=K;k>=;k--){
ans[k]=cnt;
cnt++;
int x=QUE[k];
atkd[x]=;
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(atkd[y]) continue;
f1=getf(x); f2=getf(y);
if(f1!=f2){
cnt--;
fa[f1]=f2;
}
}
}
for(int i=;i<=K;i++) printf("%d\n",ans[i]);
return ;
}
By:AlenaNuna
并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197的更多相关文章
- 【并查集】bzoj1015 [JSOI2008]星球大战starwar
倒着处理删点,就变成了加点,于是并查集. #include<cstdio> using namespace std; #define N 400001 int fa[N],kill[N], ...
- 1015: [JSOI2008]星球大战starwar - BZOJ
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713
题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...
- 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 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)
[JSOI2008]星球大战starwar 时间限制: 3 Sec 内存限制: 162 MB[题目描述] ...
- [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6849 Solved: 3204[Submit ...
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
随机推荐
- xaml中显示 “大括号左边” 文本
Content="{}{" 最合适的还是上面的写法 转义符{不好使的 要么 空格{ 要么 全角{ 要么binding
- shutil使用
1.用shutil移动文件, import shutil shutil.move('/root/test.yaml','/home/') shutil.move('/root/k8s.py','/ho ...
- 使用 WebStorm alt+f2 快速打开浏览器测试的一点bug
这个bug是涉及到中英文文件名的问题(不涉及到路径名): Case 1: 中文文件名 当打开alt+f2快捷方式打开含有中文名的html文件时,路径名直接变为localhost,所以找不到要打开的文件 ...
- html to pdf 把HTML转换为PDF
http://www.evopdf.com/userguide/userguide.htm
- .NET制作滚动条
今天,在工作的时候,刚好做到了滚动条,对这点不是很懂,所以,研究了一下,记录在这里,与大家分享. 对于前台页面,我们就只需要设置数据表的样式:style="overflow: auto; 即 ...
- Datafactory 实际使用案例
Datafactory 实际使用案例 一. 简介 QuestDataFactory 是一种快速的.易于产生测试数据工具,它能建模复杂数据关系,且有带有GUI界面.DataFactory是一 ...
- Web Service简介与开发实例
简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的 ...
- Job for jenkins.service failed because the control process exited with error code.
root@xiakaibi-PC:~# service jenkins restartJob for jenkins.service failed because the control proces ...
- [转帖]Java 8新特性探究(八)精简的JRE详解
Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api 撸了今年阿里.网易和美团的面试,我有一个重要发 ...
- [转帖]java基础学习总结——多态(动态绑定)
https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态