POJ_3321_Apple Tree
T^T太坑了吧,这题,前向星式建图,建到我发疯。卡了一共2小时。。。
#include<iostream> using namespace std; const int MAX = 100005; struct apple { int v,nxt; }edge[MAX]; int n,m,low[MAX],high[MAX],head[MAX],k,dep,c[MAX]; bool pick[MAX]; void dfs(int u)//完美的映射方式 { low[u]=++dep; //下界 for(int i=head[u];i;i=edge[i].nxt) //不管子树的编号如何变,子树的结构是不变的。。。 dfs(edge[i].v); high[u]=dep; //上界 } int sum(int x) { int ret=0; while(x) { ret+=c[x]; x-=x&-x; } return ret; } void add(int x,int d) { while(x<=n) { c[x]+=d; x+=x&-x; } } int main() { char ask[3]; int i,j,q,u,v; while(~scanf("%d",&n)) { memset(head,0,sizeof(head)); memset(c,0,sizeof(c)); memset(pick,0,sizeof(pick)); k=1; for(i=1;i<n;++i) { scanf("%d%d", &u, &v); //使用了前向星式建图 edge[k].v = v; edge[k].nxt = head[u]; head[u] = k ++; } for(i=1;i<=n;++i) add(i,1); scanf("%d",&m); dep=0; dfs(1); while(m--) { scanf("%s%d",ask,&q); if(ask[0]=='Q') { printf("%d\n",sum(high[q])-sum(low[q]-1)); } else { pick[q]^=1; add(low[q],pick[q]?-1:1); //异或一下,0变1,1变0 } } } return 0; }