poj 3321 apple tree

来源:互联网 发布:软件著作权办理时间 编辑:程序博客网 时间:2024/05/21 11:01

数组数组以及树形转线性

#include<iostream>

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 210000;
int c[maxn];
int head[maxn];
int nxt[maxn];
int e[maxn];
int tot = 1;
int n;
int fir[maxn];
int last[maxn];
int apple[maxn];
void dfs(int u,int fa){
fir[u] = tot++;
for(int i = head[u];i!=-1;i = nxt[i]){
if(e[i]==fa)continue;
dfs(e[i],u);
}
last[u] = tot++;
}
int lowbit(int x)//计算lowbit
{
    return x&(-x);
}
void add(int i,int val)//将第i个元素更改为val
{
    while(i<tot)
    {
        c[i]+=val;
        i+=lowbit(i);
    }
}
void update(int u){
int t = 0;
if(apple[u]==1){
apple[u] = 0;
t = -1;
}else {
apple[u] = 1;
t = 1;
}
add(fir[u],t);
add(last[u],t);
}
int sum(int i)//求前i项和
{
    int s=0;
    while(i>0)
    {
        s+=c[i];
        i-=lowbit(i);
    }
    return s;
}
int main(){
for(int i = 1;i<=maxn;i++)c[i] = (i&(-i)),apple[i] = 1;;
//while(1);
int u = 0;
int a,b;
scanf("%d",&n);
for(int i = 1;i<=n;i++)head[i] = -1;
for(int i = 1;i<n;i++){
scanf("%d%d",&a,&b);
e[u] = b;
nxt[u] = head[a];
head[a] = u++;
e[u] = a;
nxt[u] = head[b];
head[b] = u++;
}
dfs(1,0);
int q;
scanf("%d",&q);
char s[3];
int t;
while(q--){
scanf("%s%d",s,&t);
if(s[0]=='C'){
update(t);
}else {
printf("%d\n",(sum(last[t])-sum(fir[t]-1))/2);
}
}
//while(1);
return 0;
}