Description

  很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的
机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直
接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划
地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首
领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每
一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则
这两个星球在同一个连通块中)。

Input

  输入文件第一行包含两个整数,N (1  < =  N  < =  2M) 和M (1  < =  M  < =  200,000),分别表示星球的
数目和以太隧道的数目。星球用 0 ~ N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0 < = X <> 
Y 表示星球x和星球y之间有“以太”隧道,可以直接通讯。接下来的一行为一个整数k,表示将遭受攻击的星球的
数目。接下来的k行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这k个数互不相同,且都在0到n-1的范
围内。

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

HINT

Source

Solution

  从后往前用冰炸鸡并查集连边算联通块个数,注意不能算被毁掉的星球

  据说cin有危险

  冰炸鸡好不好吃?

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct edge
 4 {
 5     int v, nxt;
 6 }e[400005];
 7 int fa[400005], fst[400005], dam[400005], ans[400005];
 8 bool vis[400005];
 9
10 void addedge(int i, int u, int v)
11 {
12     e[i] = (edge){v, fst[u]}, fst[u] = i;
13 }
14
15 int getfa(int x)
16 {
17     return fa[x] = x == fa[x] ? x : getfa(fa[x]);
18 }
19
20 int main()
21 {
22     int n, m, k, u, v;
23     scanf("%d%d", &n, &m);
24     for(int i = 1; i <= n; ++i)
25         fa[i] = i;
26     for(int i = 1; i <= m; ++i)
27     {
28         scanf("%d%d", &u, &v);
29         ++u, ++v;
30         addedge(i << 1, u, v);
31         addedge(i << 1 | 1, v, u);
32     }
33     scanf("%d", &k);
34     for(int i = 1; i <= k; ++i)
35     {
36         scanf("%d", dam + i);
37         vis[++dam[i]] = true;
38     }
39     for(int i = 1; i <= n; ++i)
40     {
41         if(vis[i]) continue;
42         for(int j = fst[i]; j; j = e[j].nxt)
43             if(!vis[e[j].v])
44             {
45                 u = getfa(i), v = getfa(e[j].v);
46                 if(u != v) fa[u] = v;
47             }
48     }
49     for(int i = 1; i <= n; ++i)
50         if(fa[i] == i) ++ans[k + 1];
51     ans[k + 1] -= k;
52     for(int i = k; i; --i)
53     {
54         ans[i] = ans[i + 1] + 1;
55         vis[dam[i]] = false;
56         for(int j = fst[dam[i]]; j; j = e[j].nxt)
57             if(!vis[e[j].v])
58             {
59                 u = getfa(dam[i]), v = getfa(e[j].v);
60                 if(u != v) fa[u] = v, --ans[i];
61             }
62     }
63     for(int i = 1; i <= k + 1; ++i)
64         printf("%d\n", ans[i]);
65     return 0;
66 }

View Code

转载于:https://www.cnblogs.com/CtrlCV/p/5585550.html

[BZOJ1015] [JSOI2008] 星球大战starwar (并查集)相关推荐

  1. BZOJ1015 JSOI2008 星球大战starwars 并查集

    题意:给定一张无向图,不断从图上删点,询问每次删点后联通块的数量 题解:离线,在删完点后的图上不断加点,用并查集维护联通性. #include <cstdio> #include < ...

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

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

  3. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

  4. bzoj 1015: [JSOI2008]星球大战starwar

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

  5. 【BZOJ 1015】 [JSOI2008]星球大战starwar

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

  6. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)

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

  7. BZOJ 1015 [JSOI2008]星球大战starwar (逆序并查集)

    BZOJ 1015 思路:并查集只有联边的作用,无法做到拆边,因此采取逆序做法.先将边拆掉,再用并查集进行联边,不同联通块相连则联通块数目减一. 1 #include<bits/stdc++.h ...

  8. 【JSOI2008】星球大战 (并查集)

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

  9. bzoj 1015 [JSOI2008]星球大战starwar

    逆向考虑,先看作所有星球都被摧毁,然后恢复星球. 连通块个数用并查集维护,每次恢复不能算被毁掉的星球. #include<cstdio> #include<vector> us ...

最新文章

  1. 如何正确地运用人工智能模型?
  2. opengl加载显示3D模型nff类型文件
  3. .vue文件_Spring Boot 2.x(十六):玩转vue文件上传
  4. Vim 重复操作的宏录制
  5. 11、Libgdx的音频
  6. 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP
  7. 请画出使用mapreduce对英文句子_「Postgresql架构」用MapReduce的方式思考,但使用SQL...
  8. CentOS7使用yum安装mysql5.7
  9. 快递是如何被送到你手里的?一文读懂风口上的仓储自动化
  10. Hysys能量流和物质流分析
  11. (基因功能 基因表达调控)研究方案
  12. 华为云服务器客户端,华为终端云服务带来全场景云体验让用户办公更便捷
  13. 符号函数sign(x)
  14. 夜班媒体人援助项目在京启动,陈于冰说:“一直以来.....
  15. 百度AI加速器第七期火热招募
  16. python 打印一年的日历
  17. 一次Oday提权批量拿取商城服务器root权限
  18. 【Python】芝麻HTTP代理系列保姆级全套攻略(对接教程+自动领取每日IP+IP最优算法)
  19. 408数据结构历年真题
  20. 初学ISE 半加器仿真 VHDL

热门文章

  1. 分析与解决windows10下上网很慢
  2. linux sdkMannger的打开
  3. 干货 | DevSecOps在携程的最佳实践
  4. HashMap 面试 21 问,这次要跪了!
  5. Java线程详解(12)-有返回值的线程
  6. Spring 5 新增全新的reactive web框架:webflux
  7. 【Python】青少年蓝桥杯_每日一题_5.03_判断是否是三角形
  8. JPA_@Table 注解详解
  9. java判断一个数是不是质数(素数)
  10. mysql test 映射到实体_将MySql视图映射到JPA Entitites,使用哪个唯一...