题解:AT_abc401_e [ABC401E] Reachable Set
思路
看到好多大佬都用了并查集来做,小蒟蒻膜拜,只能给出一个奇奇怪怪的做法。
考虑递增枚举
如果第
否则,还需要查看是否一到
答案就是被收录点集的大小减去
AC Code:
#include<bits/stdc++.h>
using namespace std;
long long n,m,mp[200005],ans;
vector<long long>poi[200005];
inline void dfs(long long now,long long lm){
for(int i=0;i<poi[now].size();i++){
if(mp[poi[now][i]]==0){
ans++;
mp[poi[now][i]]=1;
if(poi[now][i]<=lm)dfs(poi[now][i],lm);
}
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
long long a,b;
scanf("%lld%lld",&a,&b);
poi[a].push_back(b);
poi[b].push_back(a);
}
mp[1]=1;
ans=1;
for(int i=0;i<poi[1].size();i++){
mp[poi[1][i]]=1;
ans++;
}
printf("%lld\n",ans-1);
long long last=1;//优化,只用从上一个成功的 k 往下 check 即可。
for(int i=2;i<=n;i++){
if(mp[i]==1){
dfs(i,i);
long long flag=1;
for(int j=last;j<=i;j++){//优化
if(mp[j]==0){
flag=0;
break;
}
}
if(flag==1)printf("%lld\n",ans-i),last=i;
else printf("-1\n");
}
else{
printf("-1\n");
}
}
}