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;
}

 

posted @ 2013-05-30 17:46  小仪在努力~  阅读(150)  评论(0编辑  收藏  举报