这题有着很深的背景呢……
本孱弱第一次写题解,请多多支持
这题最有意义的地方是:逆序思考。
不断的维护摧毁后的数量,会非常困难。但是!~
我们不妨去试着重建,一点一点重建。假设这些都是已经被摧毁了的,那么我们如果修复该怎么办呢?我们可以把它周围的所有道路都重新连起来,并且通过并查集合并。话不多说,上代码。
#include<bits/stdc++.h>
using namespace std;
#define N 400005
#define M 400005 //一定要开双倍啊
int k;
int v[N];//记录每一次的情况
int ans[N];//记录每一次的答案
bool dan[N];//当前有没有被损坏
struct mp{//个人喜好:所有东西写在结构体里
int n,m,cnt;
int last[N],Before[M],ver[M],tot;//链式前向星套装
int fa[N];
int find(int x){//并查集标准操作
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void init(){
cnt=n;
for(int i=0;i<n;i++){
last[i]=-1;
fa[i]=i;
}
tot=-1;
}
void add(int x,int y){//前向星
ver[++tot]=y;
Before[tot]=last[x];
last[x]=tot;
ver[++tot]=x;
Before[tot]=last[y];
last[y]=tot;
}
void father(int s){//判断重建后的点可以更新的路径
int a=find(s)