#include<bits/stdc++.h>
using namespace std;
using i64=long long;
using u64=unsigned long long;
constexpr int N=4e5+5;
vector<int> dey(N);
vector<int> edge[N],v;
struct DSU{
vector<int> f,siz;
DSU(){};
DSU(int n){
inite(n);
};
void inite(int n){
f.resize(n);
iota(f.begin(),f.end(),0);
siz.assign(n,1);
}
int find(int x){
while(f[x]!=x){
x=f[x]=f[f[x]];
}
return x;
}
bool merge(int x,int y){
x=find(x),y=find(y);
if(x==y) return false;
else{
f[y]=x;
siz[x]+=siz[y];
return true;
}
}
bool same(int x,int y){
return (find(x)==find(y));
}
void erase(int x){
siz[find(x)]--;
f[x]=x;
}
};
void solve(){
int n,m,k;
cin>>n>>m;
DSU g(n);
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
cin>>k;
vector<int> p(k+1);
for(int i=1;i<=k;++i){
cin>>p[i];
dey[p[i]]=1;
}
for(int i=0;i<n;++i){
if(dey[i]) continue;
for(auto p:edge[i]){
if(!dey[p] && !dey[i] && !g.same(p,i))
g.merge(i,p);
}
}
int ans=0;
for(int i=k;i>=1;--i){
for(int j=0;j<n;++j){
if(!dey[j] && g.f[j]==j) ans++;
}
v.push_back(ans);
ans=0;
dey[p[i]]=0;
for(auto x:edge[p[i]]){
if(!dey[x] && !g.same(p[i],x))
g.merge(p[i],x);
}
}
for(int i=0;i<n;++i){
if(g.f[i]==i) ans++;
}
v.push_back(ans);
for(int i=v.size()-1;i>=0;--i){
cout<<v[i]<<'\n';
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
solve();
return 0;
}
只有40pts其余均是TLE,实在不知道该怎么优化了,还是说做法有问题。。。