Description

非常久曾经。在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器。并攻下了星系中差点儿全部的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,非常快帝国又又一次造出了他的超级武器。

凭借这超级武器的力量。帝国開始有计划地摧毁反抗军占领的星球。因为星球的不断被摧毁,两个星球之间的通讯通道也開始不可靠起来。如今,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序。以尽量快的速度求出每一次打击之后反抗军占领的星球的连通快的个数。(假设两个星球能够通过现存的以太通道直接或间接地连通。则这两个星球在同一个连通块中)。

Input

输入文件第一行包括两个整数。N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。接下来的M行,每行包括两个整数X, Y,当中(0<=X<>Y

Output

输出文件的第一行是開始时星球的连通块个数。接下来的N行。每行一个整数。表示经过该次打击后现存星球的连通块个数。

Sample Input

8 13

0 1

1 6

6 5

5 0

0 6

1 2

2 3

3 4

4 5

7 1

7 2

7 6

3 6

5

1

6

3

5

7

Sample Output

1

1

1

2

3

3
题解:显然我们能够用并查集维护联通关系。然后我们把全部操作存下来,倒着做。把删边改成加边就可以。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int fa[1000001],point[1000001],next[1000001],cnt,a[1000001],aa[1000001];
int n,m,x,y,ans,q;
bool f[1000001];
struct use{
int st,en;
}e[10000001];
inline int find(int x)
{
if (fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
inline void add(int x,int y)
{
next[++cnt]=point[x];point[x]=cnt;
e[cnt].st=x;e[cnt].en=y;
}
int main()
{
scanf("%d%d",&n,&m);ans=n;
memset(f,true,sizeof(f));
for (int i=0;i<=n-1;i++) fa[i]=i;
for (int i=1;i<=m;i++)
{
int r1,r2;
scanf("%d%d",&x,&y);
r1=find(x);r2=find(y);
if (r1!=r2) {fa[r1]=r2;ans--;}
add(x,y);add(y,x);
}
cout<<ans<<endl;
ans=n;scanf("%d",&q);
for (int i=1;i<=q;i++)
{
scanf("%d",&x);
f[x]=false;
a[i]=x;
}
ans-=q;
for (int i=0;i<=n-1;i++) fa[i]=i;
for (int i=1;i<=cnt;i++)
if (f[e[i].st]&&f[e[i].en])
{
int r1,r2;
r1=find(e[i].st);r2=find(e[i].en);
if (r1!=r2) {fa[r1]=r2;ans-=1;}
}
aa[q]=ans;
for (int i=q;i>=1;i--)
{
int u,r1,r2;
ans+=1;
u=a[i];
f[u]=true;
for (int j=point[u];j;j=next[j])
{
if (f[e[j].st]&&f[e[j].en])
{
r1=find(e[j].st);r2=find(e[j].en);
if (r1!=r2) {fa[r1]=r2;ans-=1;}
}
}
aa[i-1]=ans;
}
for (int i=1;i<=q;i++)
printf("%d\n",aa[i]);
}

【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】的更多相关文章

  1. [bzoj1015][JSOI2008]星球大战——并查集+离线处理

    题解 给定一张图,支持删点和询问连通块个数 按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的 我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理 ...

  2. BZOJ-1015 StarWar星球大战 并查集+离线处理

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ...

  3. 洛谷P1197 [JSOI2008] 星球大战 [并查集]

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

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

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

  5. P1197 [JSOI2008]星球大战[并查集+图论]

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

  6. P1197 [JSOI2008]星球大战 并查集 反向

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

  7. 洛谷 P1197 [JSOI2008]星球大战——并查集

    先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ...

  8. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  9. BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理

    BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...

  10. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

随机推荐

  1. pymysql遇到中文编码

    明明数据库里的编码方式和字符集都没有问题,用python插入数据时,数据库里的数据还是乱码的 在数据库中插入时,能够正常显示 那就是python导出的数据存在编码问题,代码如下: # coding: ...

  2. 区间DP入门

    所为区间DP,主要是把一个大区间拆分成几个小区间,先求小区间的最优值,然后合并起来求大区间的最优值. 区间DP最关键的就是满足最优子结构以及无后效性!! 例如像是石子合并和括号匹配这两类比较经典的模型 ...

  3. 8. Truncate undo表空间

    8. Truncate undo表空间 要Truncate Undo 表空间,必须为MySQL实例配置至少两个undo表空间(两个undo表空间可确保一个undo表空间保持活动状态,另一个处于脱机状态 ...

  4. Linux基础学习-通过VM安装RHEL7.4

    虚拟机安装RHEL7.4 1.VM虚拟机设置 这里我们配置的虚拟机为1核1G,50G硬盘,NAT模式 2.Linux安装 这里时区我们选择中国上海,时间需要调整一下相差8小时. 这里添加一下中文语言支 ...

  5. Go:单元测试

    测试用的文件名必须以 _test.go 结尾: 测试用的函数名必须以 Test 开头,一般来说:Test+被测试的函数名(第一个字母必须大写): func TestXx(t *testing.T) { ...

  6. c++_方格填数(最新方法)

      方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ (如果显示有问题,也可以参 ...

  7. CSS--基础块级元素与内联元素

    在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素.在HTML和XHTML中,块级元素不能继承自行内元素(即不能嵌套在行内元素),<p&g ...

  8. 2018 GDCPC 省赛总结

    第二次参加省赛了,对比上年连STL都不会的acm入门者来说, 今年是接触acm的第二年. 首先要说的是今年的省赛比上年人数多了很多, 闭幕式200多支队伍坐满了整个礼堂还要站着不少人,所以今年的竞争其 ...

  9. .NET Core使用log4Net记录日志

    1.引入Nuget包 log4net 2.添加log4Net配置文件 <?xml version="1.0" encoding="utf-8" ?> ...

  10. [转]Selenium-Webdriver系列Python版教程(1)————快速开始

    elenium的历史,selenium2与WebDriver的关系本文就不讲了,想了解的同学们百度一下就可以Ok.     本系列教程是以Selenium-WebDriver的Python版本,首先从 ...