星球大战

【问题描述】

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

【输入格式】

输入文件第一行包含两个整数,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的范围内。

【输出格式】

第一行是开始时星球的连通块个数。接下来的K行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

【样例输入】

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

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int ma = 500001;
 9 int num, be[ma], fat[ma];
10 char c;
11 int x;
12 inline int Get(int &x)
13 {
14     x = 0;
15     while((c = getchar()) < '0' || c > '9');
16     while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
17     return x;
18 }
19 int tot, go[ma], next[ma], first[ma];
20 void Ins(int x, int y)
21 {
22     next[++tot] = first[x];
23     first[x] = tot;
24     go[tot] = y;
25     next[++tot] = first[y];
26     first[y] = tot;
27     go[tot] = x;
28 }
29 int Find(int x)
30 {
31     return (x != fat[x]) ? fat[x] = Find(fat[x]) : x;
32 }
33 int v, fa, mo;
34 int Un(int u)
35 {
36     ++num;
37     fa = Find(u);
38     for(int i = first[u]; i; i = next[i])
39     {
40         v = go[i];
41         if(be[v])
42         {
43             mo = Find(v);
44             if(fa != mo)
45             {
46                 fat[mo] = fa;
47                 --num;
48             }
49         }
50     }
51     return num;
52 }
53 bool vis[ma];
54 int n, m, k, del[ma], ans[ma];
55 int main()
56 {
57     Get(n), Get(m);
58     for(int i = 0; i < n; ++i) fat[i] = i;
59     for(int i = 0; i < m; ++i) Ins(Get(x), Get(x));
60     Get(k);
61     for(int i = 0; i < k; ++i) vis[Get(del[i])] = true;
62     for(int i = 0; i < n; ++i)
63         if(!vis[i])
64         {
65             Un(i);
66             be[i] = true;
67         }
68     ans[k] = num;
69     for(int i = k - 1; i >= 0; --i)
70     {
71         ans[i] = Un(del[i]);
72         be[del[i]] = true;
73     }
74     for(int i = 0; i <= k; ++i) printf("%d\n", ans[i]);=
75 }

转载于:https://www.cnblogs.com/lytccc/p/6492200.html

星球大战 BZOJ 1015相关推荐

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

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

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

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

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

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

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

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

  5. BZOJ 1015 题解

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

  6. bzoj 1015 并查集

    代码: //这题可以反着想,把要去掉的点倒着处理变成往图中一个一个的加点,然后用并查集处理联通快就好了. #include<iostream> #include<cstdio> ...

  7. 【BZOJ】【1015】 【JSOI2008】星球大战starwar

    并查集/时光倒流 删点维护连通块个数比较难处理,所以我们就逆序来做,先处理最后状态下有多少连通块,再依次加入被删的点,这样就变删点为加点,利用并查集即可维护连通块个数. 1 /************ ...

  8. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  9. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

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

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

最新文章

  1. 怎么查计算机网络硬件配置,如何查看电脑本机的硬件配置?
  2. java优先队列PriorityQueue修改队列内元素排序问题
  3. 日常生活小技巧 -- 名词
  4. 迷宫搜索问题最短路_迷宫的最短路问题(水+BFS宽搜)
  5. python正则中如何匹配汉字以及encode(‘utf-8’)和decode(‘utf-8’)的互转
  6. c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符
  7. leetcode628. 三个数的最大乘积(简单,我觉得你不会)
  8. 糖果(信息学奥赛一本通-T1299)
  9. 疑似全新华为Mate X2折叠屏手机入网:麒麟9000重磅加持
  10. SpringBoot热部署(实战)详解
  11. 机场也应该取个好听的名
  12. Ubuntu16.04深度学习环境+个人桌面配置(CUDA10.1 + cudnn8.0.4 + pytorch1.7)
  13. 与大数据同行—学习和教育的未来 - 电子书下载(高清版PDF格式+EPUB格式)
  14. 2018-DeepLabV3+论文解读
  15. KMplayer字幕
  16. 单核CPU处理多线程
  17. 蓝牙配对-扫描-连接-状态查询
  18. 一篇文章扫盲手机SIM卡相关知识
  19. cad角度命令怎么输入_软件CAD | 修改工具栏(上)
  20. 2017省市区最新编码(依据国家统计局最新数据生成)

热门文章

  1. 如何编辑PDF文档中的文本呢?
  2. Mac如何将DVD转换为MP3格式
  3. 如何将Mac“桌面”和“文稿”文件添加到 iCloud 云盘中?
  4. Mac如何为应用单独设置语言?
  5. 019-批量修改redis TTL和批量删除key
  6. Automapper问题记录
  7. 前端快来!最火的 Vue.js 开源项目出炉
  8. 同域下iframe父页面和子页面调用
  9. Laravel Symfony_Crawler GuzzleHttp 爬虫 抓取行政区域
  10. Linux学习一天一个命令(1)[ls命令]