【JSOI2008】星球大战
标签:time algorithm merge nbsp col problem com typedef ems
题目链接
直接算每次破坏会拆开多少个连通块貌似不可做。考虑反着加边用并查集合并。
那么我们首先用$vector$存下每个点出边到的点的序列。注意:$m\in[1,2\times 10^5]$而$n\in [1,2\times m]$所以$n\in [1,4\times 10^5]$。
读入破坏的顺序之后标记一下这些即将被破坏的点。
开始处理,首先用$BFS$连一下不会被破坏的点算连通块。注意:别连到了会被破坏的点(已经被标记),处理不好容易算重。
这里最好维护一下并查集要用的$f_i$和$sz_i$。注意:这里不用$DFS$的原因是内存只给了$125M$,处理不好容易爆栈$MLE$。
然后开始反向加边。注意:要求的是$0\sim k$时刻结束时的连通块计数,那么反向处理$i$时刻的结果就是原来$i-1$时刻的答案,自然反向加边之前的就是$k$时刻的答案。
时光逆流,每个时刻就有一个被光复的星球,没加边之前是孤立的,先把$cnt++$。
开始逐边恢复该星球的以太通讯,若目标不在同一个连通块内则有两个连通块合并,$cnt--$。注意:别向被破坏的点(有标记)连边。
恢复完毕该星球的以太通讯之后,把它的标记摘除。恭喜反抗军完成光复!【滑稽】
代码(100分):
#include
#include
#include
#include
#include
#include
#include
#include
View Code
【JSOI2008】星球大战
标签:time algorithm merge nbsp col problem com typedef ems
原文地址:https://www.cnblogs.com/Hansue/p/12913231.html
评论