那么就这样
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn = 1123456; struct Edge{ int next,to; }edge[maxn]; int head[maxn],top; void init(int n){ memset(head,-1,sizeof(head)); top=0; } void Link(int st,int ed){ edge[top].to=ed; edge[top].next=head[st]; head[st]=top++; } int siz[maxn],sid[maxn]; int _cnt; void dfs(int st,int fa){ siz[st]=1,sid[st]=_cnt++; for(int i = head[st];~i;i=edge[i].next){ int x = edge[i].to; if(x!=fa){ dfs(x,st); siz[st]+=siz[x]; } } } void tinit(){ _cnt=1; dfs(1,0); } int sum[maxn],hav[maxn]; void bitinit(){ memset(sum,0,sizeof(sum)); memset(hav,0,sizeof(hav)); } int lowbit(int x){ return x&(-x); } void add(int x,int d,int n){ while(x<=n){ sum[x]+=d; x+=lowbit(x); } } int que(int x){ int ret = 0; while(x>0){ ret += sum[x]; x-=lowbit(x); } return ret; } void update(int x,int n){ int d = hav[x]?-1:1; hav[x] = d==1; add(sid[x],d,n); } int query(int x){ int val = que(siz[x]+sid[x]-1); val-=que(sid[x]-1); return siz[x]-val; } int main(){ int n; while(~scanf("%d",&n)){ int x,y; init(n); for(int i=1;i<n;i++){ scanf("%d %d",&x,&y); Link(x,y); Link(y,x); } tinit(); bitinit(); // for(int i=1;i<=n;i++) // printf(i<n?"%d ":"%d\n",sid[i]); // for(int i=1;i<=n;i++) // printf(i<n?"%d ":"%d\n",siz[i]); int m; char ord[10]; scanf("%d",&m); while(m--){ scanf("%s %d",ord,&x); if(ord[0]=='C') update(x,n); else printf("%d\n",query(x)); } } return 0; }