参考这里
代码:
bzoj1103
#include<cstdio> #include<iostream> #include<cstring> #define Maxn 250010 using namespace std; struct edge{ int to,next; }p[Maxn]; int n; int head[Maxn],st[Maxn],l[Maxn],r[Maxn],c[Maxn<<1]; int tot,top,t; void addedge(int a,int b){ p[tot].to=b; p[tot].next=head[a]; head[a]=tot++; } inline int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x; } void dfs(int u){ st[++top]=u; while(top){ int v=st[top]; if(!l[v]){ l[v]=++t; for(int i=head[v];i!=-1;i=p[i].next) st[++top]=p[i].to; } else{ r[v]=++t; top--; } } } int lowbit(int x){ return x&-x; } void update(int x,int d){ while(x<=n+n){ c[x]+=d; x+=lowbit(x); } } int sum(int x){ int res=-1; while(x>0){ res+=c[x]; x-=lowbit(x); } return res; } int main() { int m,a,b; char s[5]; memset(head,-1,sizeof head); n=read(); for(int i=1;i<n;i++){ a=read();b=read(); if(a>b) swap(a,b); addedge(a,b); } dfs(1); for(int i=1;i<=n;i++){ update(l[i],1); update(r[i],-1); } m=read(); for(int i=0;i<n+m-1;i++){ scanf("%s",s); if(s[0]=='A'){ a=read();b=read(); if(a>b) swap(a,b); update(l[b],-1); update(r[b],1); } else{ a=read(); //cout<<sum(l[a])<<endl; printf("%d\n",sum(l[a])); } } return 0; }
#include<cstdio> #include<iostream> #include<cstring> #define Maxn 200010 using namespace std; struct edge{ int to,next; }p[Maxn]; int head[Maxn],st[Maxn],l[Maxn],r[Maxn],fa[Maxn],c[Maxn],ans[Maxn]; int tot,top,t,n; void addedge(int a,int b){ p[tot].to=b; p[tot].next=head[a]; head[a]=tot++; p[tot].to=a; p[tot].next=head[b]; head[b]=tot++; } void dfs(int u){ st[++top]=u; fa[u]=-1; while(top){ int v=st[top]; if(!l[v]){ l[v]=++t; for(int i=head[v];i!=-1;i=p[i].next) if(p[i].to!=fa[v]){ st[++top]=p[i].to; fa[p[i].to]=v; } } else{ r[v]=++t; top--; } } } int lowbit(int x){ return x&-x; } int ask(int x){ int res=0; for(int i=x;i>0;i-=lowbit(i)) res+=c[i]; return res; } void update(int x,int d){ while(x<=n+n){ c[x]+=d; x+=lowbit(x); } } int main() { int u,a,b; while(cin>>n>>u,n){ tot=top=t=0; memset(l,0,sizeof l); //memset(r,0,sizeof r); memset(head,-1,sizeof head); for(int i=1;i<n;i++){ cin>>a>>b; addedge(a,b); } //cout<<"****"<<endl; dfs(u); //cout<<"*****"<<endl; for(int i=1;i<=n+n;i++) update(i,1); for(int i=n;i>0;i--){ ans[i]=(ask(r[i]-1)-ask(l[i]))/2; update(l[i],-1); update(r[i],-1); } printf("%d",ans[1]); for(int i=2;i<=n;i++) printf(" %d",ans[i]); puts(""); } return 0; }
#include<cstdio> #include<iostream> #include<cstring> #define Maxn 200010 using namespace std; struct edge{ int to,next; }p[Maxn]; int head[Maxn],l[Maxn],r[Maxn],c[Maxn],st[Maxn],fa[Maxn],vis[Maxn]; int tot,n,top,t; void addedge(int a,int b){ p[tot].to=b; p[tot].next=head[a]; head[a]=tot++; p[tot].to=a; p[tot].next=head[b]; head[b]=tot++; } void dfs(){ st[++top]=1; fa[1]=-1; while(top){ int v=st[top]; if(!l[v]){ l[v]=++t; for(int i=head[v];i!=-1;i=p[i].next) if(fa[v]!=p[i].to){ st[++top]=p[i].to; fa[p[i].to]=v; } } else{ r[v]=++t; top--; } } } int lowbit(int x){ return x&-x; } int ask(int x){ int res=0; while(x>0){ res+=c[x]; x-=lowbit(x); } return res; } void update(int x,int d){ while(x<=n+n){ c[x]+=d; x+=lowbit(x); } } int main() { int m,x,d,a,b; char s[2]; while(cin>>n){ tot=top=t=0; memset(head,-1,sizeof head); memset(vis,0,sizeof vis); memset(l,0,sizeof l); for(int i=1;i<n;i++){ cin>>a>>b; addedge(a,b); } dfs(); for(int i=1;i<=n+n;i++) update(i,1); cin>>m; while(m--){ scanf("%s%d",s,&x); if(s[0]=='C'){ if(!vis[x]) {d=-1;vis[x]=1;} else {d=1;vis[x]=0;} update(l[x],d); update(r[x],d); } else printf("%d\n",(ask(r[x])-ask(l[x]-1))/2); } } return 0; }