并查集+时光倒流 || [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 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
随机推荐
- Linux C/C++基础 文件(中)
1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...
- Linux C/C++基础——内存分区
1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...
- java内存模型的实现
前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.其中,Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识. 网上有很 ...
- Laravel关联模型
public $timestamps = false;//不存时间 1.多对多关联.如收藏.用户表users,产品表products,收藏中间表user_favorite_products.那么在用户 ...
- shell作业01
1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.” ...
- 【数据库】Redis/MongoDB/MySQL/Oracle随笔索引
数据库体系 [思维导图]数据库体系 密码: a8ni Redis JPA
- learning_git_from_Liao
安装 windows git 直接去官网就行,地址如下: https://git-scm.com 安装完成后,在开始菜单里找到"Git"->"Git Bash&qu ...
- Storm本地启动拓扑报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout
问题描述: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology ...
- Python中的 _init__和 _new__的区别
使用python 的面向对象写过程序之后,相信童鞋对 __init__ 方法已经非常的熟悉了.这个方法通常是 在初始化一个实例的时候使用的. 例如: class MysqlConnector(obje ...
- CF 1133C Balanced Team
题目链接:http://codeforces.com/problemset/problem/1133/C 题目分析 (个人感受:我看错了题目,硬是写了近一个小时!) 这个题目要求一个最长的序列,使得这 ...