• POJ 3321 Apple Tree

VJ链接:https://vjudge.net/problem/POJ-3321
先贴上以后补题解。。(咕咕咕
一个教训就是树状数组一定要从一开始,
一个while(x>=0)死循环了找半天,,,太久不用树状数组了。
//#include <bits/stdc++.h>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<cstdio>
#include<vector>
#include<string>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
#define pi  acos(-1.0)
#define INF  0x3f3f3f3f
#define mod   1000000009
#define endll printf("\n")
#define s1(a) scanf("%d",&a)
#define s2(a,b) scanf("%d %d",&a,&b)
#define mem(a,b) memset(a,b,sizeof(a))
#define s3(a,b,c) scanf("%d %d %d",&a,&b,&c)
int n,m,tot,cnt;
int head[MAXN];
int in[MAXN],out[MAXN];
int bits[MAXN];
struct IN
{
    int v;
    int next;
}edge[MAXN<<2];//注意无向存图
void addedge(int u,int v)
{
    edge[tot].v=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void input()
{
    s1(n);
    tot=1;
    mem(head,0);
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        addedge(u,v);
        addedge(v,u);
    }
}
//
void dfs(int x,int pre)
{
    in[x]=++cnt;
    for(int i=head[x];i;i=edge[i].next)
    {
        int nx=edge[i].v;
        if(nx!=pre)
            dfs(nx,x);
    }
    out[x]=cnt;
    //out时不记录时间戳那么in[i]序列即为原数组重新排号之后的新序列
    //in[i]数组范围即为1~n
}
//
void update(int x,int v)
{
    while(x<=n)
    {
        bits[x]+=v;
        x+=(x&(-x));
    }
}
int sum(int x)
{
    int ans=0;
    while(x>0)//血的教训啊。。。
    {
        ans+=bits[x];
        x-=(x&-x);
    }
    return ans;
}
int main()
{
    input();//建图
    cnt=0;
    dfs(1,0);
    for(int i=1;i<=n;i++)
        update(i,1);
    s1(m);
    while(m--)
    {
        char op[4];
        int x;
        scanf("%s %d",op,&x);
        if(op[0]=='Q')
            printf("%d\n",sum(out[x])-sum(in[x]-1));
        else
            update(in[x],(sum(in[x])-sum(in[x]-1))?-1:1);
    }
    return 0;
}