http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10486
题意:一颗有n个分支的苹果树,根为1,每个分支只有一个苹果,给出n-1个分支的关系和给出m个操作,Q x表示询问x的子树(包括x)苹果的数量,C x表示若分支x上有苹果,则摘下来,若没有则会生出一个,输出每个询问的值。
DFS序
每个子树对应的孩子节点包括根用dfs序存在连续区间中,用树状数组维护区间
1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <iostream> 6 #include <queue> 7 #include <stack> 8 #include <cmath> 9 #include <set> 10 #include <algorithm> 11 #include <vector> 12 // #include<malloc.h> 13 // #include <conio.h> 14 using namespace std; 15 #define clc(a,b) memset(a,b,sizeof(a)) 16 #define LL long long 17 const int inf = 0x3f3f3f3f; 18 const double eps = 1e-5; 19 // const double pi = acos(-1); 20 const LL MOD = 1e8; 21 const int N=1<<13; 22 // const LL p = 1e9+7; 23 void fre() { 24 freopen("in.txt","r",stdin); 25 } 26 // inline int r(){ 27 // int x=0,f=1;char ch=getchar(); 28 // while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} 29 // while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 30 // return x*f; 31 // } 32 const int maxn = 100005; 33 34 struct Edge{ 35 int v,next; 36 } e[maxn*4]; 37 38 int head[maxn],tot,n; 39 bool vis[maxn]; 40 int sum[maxn*2]; 41 int st[maxn],ed[maxn]; 42 int inx; 43 44 void init(){ 45 for(int i=0;i<maxn*2;i++){ 46 head[i>>1]=-1; 47 sum[i]=0; 48 vis[i>>1]=true; 49 } 50 tot=0; 51 inx=0; 52 } 53 54 void add(int u,int v){ 55 e[tot].v=v; 56 e[tot].next=head[u]; 57 head[u]=tot++; 58 } 59 60 void dfs(int rt,int fa){ 61 st[rt]=++inx; 62 for(int i=head[rt];~i;i=e[i].next){ 63 int v=e[i].v; 64 if(v==fa) continue; 65 dfs(v,rt); 66 } 67 ed[rt]=++inx; 68 } 69 70 int lowbit(int x){ 71 return x & -x; 72 } 73 74 int query(int x){ 75 int ans=0; 76 while(x>=1){ 77 ans+=sum[x]; 78 x -= lowbit(x); 79 } 80 return ans; 81 } 82 83 void update(int x,int val){ 84 while(x<=inx){ 85 sum[x]+=val; 86 x+=lowbit(x); 87 } 88 } 89 90 int main(){ 91 // fre(); 92 while(~scanf("%d",&n)){ 93 init(); 94 int u,v; 95 for(int i=0;i<n-1;i++){ 96 scanf("%d%d",&u,&v); 97 add(u,v); 98 add(v,u); 99 } 100 dfs(1,-1); 101 for(int i=1;i<=n;i++) 102 update(st[i],1); 103 int q; 104 char c; 105 int x; 106 scanf("%d",&q); 107 while(q--){ 108 getchar(); 109 scanf("%c%d",&c,&x); 110 if(c=='Q'){ 111 int ans=query(ed[x])-query(st[x]-1); 112 printf("%d ",ans); 113 } 114 else{ 115 if(vis[x]){ 116 update(st[x],-1); 117 } 118 else 119 update(st[x],1); 120 vis[x]=!vis[x]; 121 } 122 } 123 } 124 return 0; 125 }