#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int temp[maxn],s[maxn],e[maxn],timeflag;
struct node1{int l,r;}apple[maxn];
struct node2{int tail,next;}edge[maxn];
void init()
{
memset(apple,0,sizeof(apple));
memset(temp,-1,sizeof(temp));建议初始化为-1,此处为0也可以,在下边相应修改一出就可以ac
memset(edge,0,sizeof(edge));
memset(s,0,sizeof(s));
memset(e,0,sizeof(e));
timeflag=1;
}
void update(int num,int x,int y)
{
edge[num].tail=y;
edge[num].next=temp[x];
temp[x]=num;
}
void dfs(int num)
{
apple[num].l=timeflag;
for(int i=temp[num];i!=-1;i=edge[i].next)
dfs(edge[i].tail);
apple[num].r=timeflag++;
}
inline int lowbit(int num)
{
return num&(-num);
}
void change(int num)
{
e[num]=!e[num];
if(e[num])
for(int i=num;i<timeflag;i+=lowbit(i))
s[i]++;
else
for(int i=num;i<timeflag;i+=lowbit(i))
s[i]--;
}
int sum(int num)
{
int res=0;
for(int i=num;i>0;i-=lowbit(i))
res+=s[i];
return res;
}
int main()
{
int n,m,i,x,y;
char str[5];
init();//初始化
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
update(i,x,y);//建立边
}
dfs(1);
for(i=1;i<=n;i++)
change(i);//将非线性树结构转化为线性结构
scanf("%d",&m);
while(m--)
{
scanf("%s%d",str,&x);
if(str[0]=='C')
change(apple[x].r);
else
printf("%d\n",sum(apple[x].r)-sum(apple[x].l-1));
}
return 0;
}
poj 3321 dfs+树状数组
最新推荐文章于 2021-08-12 09:23:36 发布