LG#P1197. [JSOI2008] 星球大战

提交2 通过1
通过率50%
时间限制2000ms
内存限制512MiB
    ID: 12128 传统题 2000ms 512MiB 尝试: 2 已通过: 1 难度: 普及+/提高- 上传者: 标签>GESPGESP强化C++c++编程题并查集离线删点逆序处理

题目描述

题目描述

很久以前,在一个遥远的星系中,黑暗帝国依靠超级武器控制着整个星系。一次偶然的机会,反抗军摧毁了这件武器,并占领了几乎全部星球。各星球之间分布着特殊的“以太隧道”,它们使星球能够直接或经过其他星球间接通信。

然而帝国很快重建了超级武器,并准备按照既定顺序摧毁反抗军占领的若干星球。一颗星球遭到摧毁后,这颗星球以及所有与它相连的以太隧道都会立即从通信网络中消失。随着攻击持续进行,原来互相能够通信的星球可能被分割成多个互不连通的区域。

如果两颗仍然存在的星球能够通过若干条现存以太隧道直接或间接到达,就称它们位于同一个连通块。反抗军首领希望知道完整星系最初有多少个连通块,并在帝国每完成一次攻击后,立即得到剩余星球所形成的连通块数量。

请根据原始隧道网络和攻击顺序,依次计算这 k+1k+1 个结果。

输入格式

第一行包含两个整数 n,mn,m,分别表示星球数和以太隧道数。星球编号为 00n1n-1

接下来 mm 行,每行包含两个整数 x,yx,y,表示星球 xx 与星球 yy 之间存在一条双向以太隧道。

随后一行包含整数 kk,表示会遭受攻击的星球数。

接下来 kk 行,每行一个整数,按照帝国实际攻击顺序给出目标星球。所有目标互不相同。

输出格式

输出共 k+1k+1 行。

第一行表示任何攻击发生前,全部星球形成的连通块数;接下来的第 ii 行表示第 ii 次攻击结束后,仍存在的星球形成的连通块数。

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
1
1
1
2
3
3

样例说明 #1

按照攻击顺序删除星球后,现存网络的连通块数量依次发生变化。

2 1
0 1
1
0
1
1

样例说明 #2

攻击前两颗星球相连,摧毁其中一颗后只剩一个孤立星球,连通块数仍为 11

4 2
0 1
2 3
2
1
2
2
2
2

样例说明 #3

原图本来有两个连通块,攻击会使每个部分留下不同数量的现存星球。

数据范围与约定

对于全部数据,1m2×1051\le m\le 2\times 10^51n2m1\le n\le 2m0x,y<n0\le x,y<nxyx\ne y0kn0\le k\le n,被攻击的星球编号均合法且互不相同。