-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path1015 [JSO2008]星球大战starwar.cpp
57 lines (57 loc) · 1.12 KB
/
1015 [JSO2008]星球大战starwar.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <cstdio>
#define sizeM 200005
#define sizeN 2*sizeM
int N,M,S,d[sizeN],i,ans[sizeN+1];
struct node *base;
struct edge{
node* ed;
edge* next;
edge(node* _ed,edge* _next):ed(_ed),next(_next){}
};
struct node{
edge* son;
node* belong;
bool exist;
node():son(NULL),belong(this),exist(true){}
inline void addedge(node* ed){
edge* e=new edge(ed,son);
son=e;
}
void renew(){
if (this==belong) return;
belong->renew();
belong=belong->belong;
}
inline bool link(node* ed){
renew();ed->renew();
if (belong!=ed->belong){
ed->belong->belong=belong;
return true;
}
return false;
}
int recover(){
exist=true;
int ret=1;
for (edge* e=son;e;e=e->next) if (e->ed->exist)
ret-=link(e->ed);
return ret;
}
};
int main(){
scanf("%d%d",&N,&M);
node v[N];base=v;
int X,Y;
while (M--){
scanf("%d%d",&X,&Y);
v[X].addedge(v+Y);
v[Y].addedge(v+X);
}
scanf("%d",&S);
for (i=0;i<S;++i) scanf("%d",&d[i]),v[d[i]].exist=false;
ans[S]=0;
for (i=0;i<N;++i) if (v[i].exist) ans[S]+=v[i].recover();
for (i=S-1;i>=0;--i)
ans[i]=ans[i+1]+v[d[i]].recover();
for (i=0;i<=S;++i) printf("%d\n",ans[i]);
}