星球大战 BZOJ 1015

摘要:
凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。星球用0~N-1的整数编号。接下来的K行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

星球大战

【问题描述】

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

【输入格式】

输入文件第一行包含两个整数,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 namespacestd;
8 const int ma = 500001;
9 intnum, be[ma], fat[ma];
10 charc;
11 intx;
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     returnx;
18 }
19 inttot, go[ma], next[ma], first[ma];
20 void Ins(int x, inty)
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(intx)
30 {
31     return (x != fat[x]) ? fat[x] =Find(fat[x]) : x;
32 }
33 intv, fa, mo;
34 int Un(intu)
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     returnnum;
52 }
53 boolvis[ma];
54 intn, m, k, del[ma], ans[ma];
55 intmain()
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
", ans[i]);=
75 }

免责声明:文章转载自《星球大战 BZOJ 1015》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇andoird软件开发之一个记录账号密码的APP--bmob后台c# 利用百度图像处理【人像分割】一键抠图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

甲骨文ARM架构云服务器部署宝塔+.net 5.0

前言前段时间,甲骨文推出了一款采用ARM架构的免费服务器,可以申请永久免费的4核、24GB内存、4G带宽,非常棒。然而,由于ARM架构的CPU。例如,编译和安装MySQL 5.7是可以的,所以不需要麻烦。创建后,ssh被连接并切换到根帐户sudo-i II。安装宝塔。创建服务器。更新包并安装BBR后,您可以使用官方脚本yu_install-wget&...

解决Windows 10每次重启默认浏览器都被重置为IE的一个办法

我的Windows10电脑每次设置默认浏览器重启后都会被重置为IE,这是个令人抓狂的问题。现在大部分浏览器都不支持IE浏览器了,如果每次点击外链都自动通过IE打开,则需要额外的操作手动拷贝粘贴到火狐打开,会影响工作效率。在网上找了各种各样的解决办法都不灵……再设置一次默认浏览器如下图所示,设置好了之后重启电脑试一下吧,祝你好运!...

windows server2012 nVME和网卡等驱动和不识别RAID10问题

安装2012--不识别M.2nVME,下载官方驱动程序,并将其注入没有多个驱动程序的系统--添加ITSK通用驱动程序:|Win8012R2.x64网卡驱动程序无法打开--提取官方驱动程序EXE文件以添加网卡驱动程序不识别SATARAID10--超过2T,最大Legacy为2T。...

Element UI 弹窗(Dialog)改成自适应高度,仅body内容部分滚动

定义样式如下:.abow_dialog{display:flex;justify-content:center;align-items:Center;overflow:hidden;.el-dialog{margin:0auto!important;height:90%;overflow:hidden;.el-dialog__body{position:ab...

"SQLserver 事务日志已满"解决方法

如果不够,备份后换个地方存[注:tempdb你数据库名称。...

ubuntu的ufw如何开放特定端口?

ubuntu的ufw是如何打开特定端口的?1.安装sudoapt getinstallufw2.启用sudoufwenable以默认情况下禁用外部访问sudoufwdefaultdeny 3.查看状态sudoufwstatus4.添加端口sudoufwallow80805。删除端口sudoufwdeleteallow808080806。允许特定源的IP地址从...