-
POJ 3321 Apple Tree
VJ链接:https://vjudge.net/problem/POJ-3321
先贴上以后补题解。。(咕咕咕
一个教训就是树状数组一定要从一开始,
一个while(x>=0)死循环了找半天,,,太久不用树状数组了。
//#include <bits/stdc++.h> #include<map> #include<set> #include<queue> #include<cmath> #include<stack> #include<ctime> #include<cstdio> #include<vector> #include<string> #include<sstream> #include<cstdlib> #include<cstring> #include<cassert> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1000000009 #define endll printf("\n") #define s1(a) scanf("%d",&a) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) int n,m,tot,cnt; int head[MAXN]; int in[MAXN],out[MAXN]; int bits[MAXN]; struct IN { int v; int next; }edge[MAXN<<2];//注意无向存图 void addedge(int u,int v) { edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } void input() { s1(n); tot=1; mem(head,0); for(int i=0;i<n-1;i++) { int u,v; scanf("%d %d",&u,&v); addedge(u,v); addedge(v,u); } } // void dfs(int x,int pre) { in[x]=++cnt; for(int i=head[x];i;i=edge[i].next) { int nx=edge[i].v; if(nx!=pre) dfs(nx,x); } out[x]=cnt; //out时不记录时间戳那么in[i]序列即为原数组重新排号之后的新序列 //in[i]数组范围即为1~n } // void update(int x,int v) { while(x<=n) { bits[x]+=v; x+=(x&(-x)); } } int sum(int x) { int ans=0; while(x>0)//血的教训啊。。。 { ans+=bits[x]; x-=(x&-x); } return ans; } int main() { input();//建图 cnt=0; dfs(1,0); for(int i=1;i<=n;i++) update(i,1); s1(m); while(m--) { char op[4]; int x; scanf("%s %d",op,&x); if(op[0]=='Q') printf("%d\n",sum(out[x])-sum(in[x]-1)); else update(in[x],(sum(in[x])-sum(in[x]-1))?-1:1); } return 0; }