题目分析:
这道题的难点是如何构造一个区间。用dfs来确定区间,然后直接用树状数组做。
PS:用vector来存储边可能会超时
下面是代码:
#include <stdio.h>
#include <string.h>
#define maxn 101000
struct Node
{
int v;
int next;
} node[maxn<<1];
int n,m,cnt,num;
int a[maxn],flag[maxn],head[maxn];
int low[maxn],high[maxn];
void add(int u,int v)
{
node[num].v = v;
node[num].next = head[u];
head[u] = num++;
}
void dfs(int u)
{
low[u] = ++cnt;
flag[u] = 1;
for(int i = head[u]; i != -1; i = node[i].next)
if(!flag[node[i].v]) dfs(node[i].v);
high[u] = cnt;
}
inline void update(int x,int v)
{
while(x <= n)
{
a[x] += v;
x += x&(-x);
}
}
inline int query(int x)
{
int ret = 0;
while(x >= 1)
{
ret += a[x];
x -= x&(-x);
}
return ret;
}
int main()
{
scanf("%d",&n);
num = 0;
memset(head,-1,sizeof(head));
for(int i = 1; i < n; i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
cnt = 0;
memset(flag,0,sizeof(flag));
dfs(1);
memset(a,0,sizeof(a));
for(int i = 1; i <= n; i++) update(low[i],1);
scanf("%d",&m);
for(int i = 1; i <= m; i++)
{
char op[3];
int x;
scanf("%s%d",op,&x);
if(op[0] == 'Q') printf("%d\n",query(high[x]) - query(low[x]-1));
else
{
if(flag[x]) update(low[x],-1);
else update(low[x],1);
flag[x] = (!flag[x]);
}
}
return 0;
}