前言

废物POJ,QDUOJ都比它强!!!废物POJ!
万能头用不了还说的过去,妈的,你告诉我还卡二维vector???非得用个vector<vector<int> > v(N)???debug 3h???wdnmd
哦,唯一的一个优点就是快。</int>

题目链接

http://poj.org/problem?id=3321

解题思路

首先,客观的说(不带主观色彩),这个题数据是不是过于水?通过AC代码,发现输入的a,b两个节点一定是a位于靠近根的位置,b位于远离根的位置,居然不用判断是不是经过父亲节点。
其次,POJ垃圾!
不想讲这个题,直接挂个类似的题吧。
求和

AC代码

#include<iostream>
#include<algorithm>
#include<vector>
#define lowbit(x) x&(-x)

using namespace std;

const int N=1e5+10;

vector<vector<int> > e(N);
int Time=0,n,x,m,u,v,in[N],out[N],c[N],a[N];
bool vis[N];
char op;

void dfs(int x)
{
    in[x]=++Time;
    for(int i=0;i<e[x].size();i++) dfs(e[x][i]);
    out[x]=Time;
}


void update(int x,int add)
{
    while(x<=n)
    {
        c[x]+=add;
        x+=lowbit(x);
    }
}

int getsum(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
    } 

    dfs(1);

    for(int i=1;i<=n;i++)
    update(i,1),a[i]=1;

    scanf("%d",&m);
    while(m--)
    {
        getchar();
        scanf("%c%d",&op,&x);
        if(op=='C')
        update(in[x],a[x]?-1:1),a[x]=!a[x];
        else 
        printf("%d\n",getsum(out[x])-getsum(in[x]-1));
    }

    return 0;
}

总结

妈的,越想越气,一下午本来想学完欧拉序,一个***题卡了俩小时,***,快六点了,真是***POJ!
早晚倒闭吧快!