题面:P1197 [JSOI2008]星球大战

题解:

坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年。。

并查集不支持拆开(但是可以撤销合并),只支持合并。所以把询问离线了,从最后状态到初状态开始一个个往当前图里加点。

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的更多相关文章

  1. 【并查集】bzoj1015 [JSOI2008]星球大战starwar

    倒着处理删点,就变成了加点,于是并查集. #include<cstdio> using namespace std; #define N 400001 int fa[N],kill[N], ...

  2. 1015: [JSOI2008]星球大战starwar - BZOJ

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  3. 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713

    题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...

  4. BZOJ1015[JSOI2008]星球大战starwar[并查集]

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5253  Solved: 2395[Submit ...

  5. [1015][JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2124  Solved: 909[Submit] ...

  6. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3895  Solved: 1750[Submit ...

  7. BZOJ 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)

    [JSOI2008]星球大战starwar                                                时间限制: 3 Sec 内存限制: 162 MB[题目描述] ...

  8. [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 6849  Solved: 3204[Submit ...

  9. BZOJ 1015: [JSOI2008]星球大战starwar 并查集

    1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...

随机推荐

  1. Linux C/C++基础 文件(中)

    1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...

  2. Linux C/C++基础——内存分区

    1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...

  3. java内存模型的实现

    前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.其中,Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识. 网上有很 ...

  4. Laravel关联模型

    public $timestamps = false;//不存时间 1.多对多关联.如收藏.用户表users,产品表products,收藏中间表user_favorite_products.那么在用户 ...

  5. shell作业01

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.” ...

  6. 【数据库】Redis/MongoDB/MySQL/Oracle随笔索引

    数据库体系 [思维导图]数据库体系 密码: a8ni Redis JPA

  7. learning_git_from_Liao

    安装 windows git 直接去官网就行,地址如下: https://git-scm.com 安装完成后,在开始菜单里找到"Git"->"Git Bash&qu ...

  8. Storm本地启动拓扑报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout

    问题描述: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology ...

  9. Python中的 _init__和 _new__的区别

    使用python 的面向对象写过程序之后,相信童鞋对 __init__ 方法已经非常的熟悉了.这个方法通常是 在初始化一个实例的时候使用的. 例如: class MysqlConnector(obje ...

  10. CF 1133C Balanced Team

    题目链接:http://codeforces.com/problemset/problem/1133/C 题目分析 (个人感受:我看错了题目,硬是写了近一个小时!) 这个题目要求一个最长的序列,使得这 ...