很早就看到了题目但看到问题缺漏就果断跳开了。。。你萌说乱搞,然后我乱搞就华丽丽的TLE了。。。
至于倒着加点,脑子转不过来自己应该想不到orz
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(i=l;i<=r;i++) 3 #define dec(i,l,r) for(i=l;i>=r;i--) 4 #define inf 1e9 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 #define NM 400000+1 7 using namespace std; 8 struct edge{ 9 int t; 10 edge *next; 11 }e[2*NM],*h[NM]; 12 int a[NM],f[NM],q[NM],ans,s,i,n,m,x,y; 13 bool v[NM]; 14 void add(int x,int y){ 15 e[++s].t=y;e[s].next=h[x];h[x]=&e[s]; 16 } 17 int find(int x){ 18 return f[x]==x?x:f[x]=find(f[x]); 19 } 20 void addnode(int x){ 21 for(edge *j=h[x];j;j=j->next) 22 if(v[j->t]){ 23 int a=find(j->t),b=find(x); 24 if(a!=b){ 25 f[a]=b; 26 ans--; 27 } 28 } 29 } 30 int main(){ 31 scanf("%d%d",&n,&m); 32 inc(i,0,n-1)f[i]=i; 33 inc(i,1,m){ 34 scanf("%d%d",&x,&y); 35 add(x,y);add(y,x); 36 } 37 mem(v,true); 38 scanf("%d",&m); 39 inc(i,1,m){ 40 scanf("%d",&a[i]); 41 v[a[i]]=false; 42 } 43 inc(i,0,n-1) 44 if(v[i]){ 45 ans++; 46 addnode(i); 47 } 48 q[m+1]=ans; 49 dec(i,m,1){ 50 ans++; 51 v[a[i]]++; 52 addnode(a[i]); 53 q[i]=ans; 54 } 55 inc(i,1,m+1)printf("%d\n",q[i]); 56 return 0; 57 }