DFS将树转变成树状数组,前向星存图
void dfs(int x){
l[x]=cnt;
for(int i=head[x];i!=-1;i=node[i].next)
cnt++,dfs(node[i].to);
r[x]=cnt;
return ;
}
接下去就是树状数组改点求段
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<vector>
#define cl(x,y) memset(x,y,sizeof(x))
#define N 100010
using namespace std;
namespace BIT{
int maxn,c[N];
#define lowbit(x) ((x)&(-x))
void init(int n){maxn=n;}
inline void add(int a,int x){
for(int i=a;i<=maxn;i+=lowbit(i))c[i]+=x;
}
inline int sum(int a){
int s=0;
for(int i=a;i;i-=lowbit(i))s+=c[i];
return s;
}
inline int sum(int l,int r){
return sum(r)-sum(l-1);
}
#undef lowbit
}
int n,m,cnt=1,head[N],l[N],r[N];
bool apple[N];
char c;
struct edge{
int to,next;
}node[N];
void dfs(int x){
l[x]=cnt;
for(int i=head[x];i!=-1;i=node[i].next)
cnt++,dfs(node[i].to);
r[x]=cnt;
return ;
}
inline void test(){
int x;
scanf("%d",&x);
printf("%d\n",BIT::sum(l[x],r[x]));
}
inline void pick(){
int x;
scanf("%d",&x);
if(apple[x])BIT::add(l[x],-1);
else BIT::add(l[x],1);
apple[x]=!apple[x];
}
int main(){
scanf("%d",&n);BIT::init(n);
cl(head,-1);cl(node,0);cl(apple,1);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
node[i].to=y;
node[i].next=head[x];
head[x]=i;
}
dfs(1);
scanf("%d",&m);
for(int i=1;i<=cnt;i++)BIT::add(i,1);
for(int i=1;i<=m;i++){
cin>>c;
if(c=='Q')test();
else pick();
}
return 0;
}