这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维。(BZOJ第10道非SB题纪念)

  先给出题目

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
  对于这道题,每次摧毁一个点,直接一遍一遍维护强连通分量,是基本不可做的。
  所以我们可以试着考虑倒着做。
  先加入那些从始至终也没有被摧毁的点,然后倒着维护:每次新加入点后强连通分量的个数,用并查集维护这一过程。(这我数组开小了调的大半天/再见)
  然后局部地方稍微优化
 #include<stdio.h>
struct shit{
int aim,next;
}e[];
int head[],num,s[],ans[],rank[],fa[],point;
bool mp[],us[];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void fuck(int x,int y)
{
e[++point].aim=y,e[point].next=head[x],head[x]=point;
}
void insert(int x)
{
int i=head[x],p=find(x),q;
while(i)
{
if(us[e[i].aim])
{
q=find(e[i].aim);
if(q!=p)fa[q]=p,num--;
}
i=e[i].next;
}
}
int main()
{
int d,n,m,a,b;
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)fa[i]=i;
for(int i=;i<=m;++i)
{
scanf("%d%d",&a,&b);
fuck(a,b);
fuck(b,a);
}
scanf("%d",&d);
for(int i=;i<=d;++i)
{
scanf("%d",&s[i]);
mp[s[i]]=true;
}
for(int i=;i<n;++i)
if(!mp[i])
{
num++;
insert(i);
us[i]=true;
}
ans[d+]=num;
for(int i=d;i;i--)
{
num++;
insert(s[i]);
us[s[i]]=true;
ans[i]=num;
}
for(int i=;i<=d+;++i)printf("%d\n",ans[i]);
return ;
}

值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)的更多相关文章

  1. 值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

    什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之 ...

  2. 值得一做》关于一道DP+SPFA的题 BZOJ1003 (BZOJ第一页计划) (normal-)

    这是一道数据范围和评测时间水的可怕的题,只是思路有点难想,BUT假如你的思路清晰,完全了解怎么该做,那就算你写一个反LLL和反SLE都能A,如此水的一道题,你不心动吗? 下面贴出题目 Descript ...

  3. 值得一做》一道类似于货车运输的题目(BZOJ3732)(easy+)

    这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题 直接先甩题目 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条 ...

  4. poj 1797(并查集)

    http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...

  5. POJ-1182 分组并查集

    今天刚发现,之前做的并查集只是贴模板基本就能过,题意改变一点,自己还是不懂,其实我还没入门呢... 题意:食物链,A吃B,B吃C,C吃A,输入m组数据: 1 a b:a 和 b 是同一类 2 a b: ...

  6. CodeForces 698B Fix a Tree (并查集应用)

    当时也是想到了并查集,但是有几个地方没有想清楚,所以就不知道怎么写了,比如说如何确定最优的问题.赛后看了一下别人的思路,才知道自己确实经验不足,思维也没跟上. 其实没有那么复杂,这个题目我们的操作只有 ...

  7. BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化

    LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...

  8. BZOJ2054 疯狂的馒头 并查集

    题意:懒得写了有空再补上 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2054 离线从后往前做,并查集维护下一个没染色的就可以啦- #incl ...

  9. 种类并查集,Poj(1703)

    题目链接:http://poj.org/problem?id=1703 第一次做种类并查集,有的地方还不是很清楚,想了一上午,有点明白了,这里记录一下. 这里我参考的红黑联盟的题解. 关键:种类并查集 ...

随机推荐

  1. LINUX (centos)设置IP地址,网关,DNS

    首先:备份原始配置文件: [logonmy@logon ~]$ cd /etc/sysconfig/network-scripts/ [logon@logon network-scripts]$ pw ...

  2. 21天学通C++_Day4

    0.迭代器 昨天晚上3G移动通信实验的时候,需要写一些简单的C程序,用到for循环的时候,发现在不同的for循环中,若定义标识符相同的变量名时,会有报错,环境是VC6: 可是一想到在for语句声明的迭 ...

  3. Python基本特殊方法之__new__

    __new__()和不可变对象 __new__方法的一个用途是初始化不可变对象,__new()__方法中允许创建未初始化的对象,这允许我们在__init__()方法被调用之前先设置对象的属性 例:为f ...

  4. js实现弹出窗口+遮罩层+tab切换

    [功能1]点击约谈按钮,弹出对话框和遮罩层(自己的叫法 专业叫法没有查) [部分重点代码] [下面的方法] (1)获取系统时间如何实现(2)点击如何实现弹出窗口和遮罩层 $(".date_n ...

  5. 如何加快MyEclipse的启动速度

    学习java开发的朋友对Myeclipse应该不陌生,MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的 ...

  6. 在C#获取麦克风输入的声音的波形图

    怎么获取声音波动的频率,在网上找来一些这方面的资料: DirectX的 DirectSound http://zhidao.baidu.com/question/448587955.html http ...

  7. 洛谷 2680 (NOIp2015) 运输计划

    题目:https://www.luogu.org/problemnew/show/P2680 因为是最长的时间最短,所以二分! 离线LCA可以知道路径长度.每次只看超过二分值的路径. 原本的想法是遍历 ...

  8. 加载rocksdb实例报错:java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\librocksdbjni3696928169151614297.dll

    项目的缓存中用到了rocksdb,实例化时报错了: Related cause: org.springframework.beans.factory.BeanCreationException: Er ...

  9. css学习笔记之图像

    图像与文本的对齐方式: vertical-align:text-top;表示的意思是图像的顶部和同一行的文本对齐,但文本不会超出图片的上边线. vertical-align:middle;表示的意思是 ...

  10. ORACLE常识

    1. ORACLE中查看表中的外键来源于哪些表 select cl.table_name from user_cons_columns cl left join user_constraints c ...