POJ3321 Apple Tree
2017-02-13 19:55
344 查看
裸的dfs序,直接树状数组维护就好了。
//QWsin #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=100000+10; const int maxm=200000+10; int first[maxn],next[maxm],ecnt; struct Edge{int u,v;Edge(int u=0,int v=0):u(u),v(v){}}e[maxm]; inline void add_edge(int u,int v){ next[ecnt]=first[u];first[u]=ecnt;e[ecnt++]=Edge(u,v); next[ecnt]=first[v];first[v]=ecnt;e[ecnt++]=Edge(v,u); } int L[maxn],R[maxn]; int dfs_clk; void dfs(int u,int fa){ L[u]=++dfs_clk; for(int i=first[u];i!=-1;i=next[i]) if(e[i].v!=fa) dfs(e[i].v,u); R[u]=dfs_clk; } int C[maxn],n; #define lowbit(i) ((i)&-(i)) inline void updata(int pos,int val){ for(int i=pos;i<=n;i+=lowbit(i)) C[i]+=val; } inline int query(int pos){ int ret=0; for(int i=pos;i;i-=lowbit(i)) ret+=C[i]; return ret; } char op[10];int x; int vis[maxn]; int main() { cin>>n;memset(first,-1,sizeof first); for(int i=1;i<=n;++i) updata(i,vis[i]=1); for(int i=1,u,v;i<n;++i){ scanf("%d%d",&u,&v); add_edge(u,v); } dfs(1,1); int m;cin>>m; while(m--) { scanf("%s%d",op,&x); if(op[0]=='C') { if(vis[x]) updata(L[x],-1); else updata(L[x],1); vis[x]^=1; } else printf("%d\n",query(R[x])-query(L[x]-1)); } return 0; }
相关文章推荐
- POJ3321---Apple Tree(树状数组)
- POJ3321 Apple Tree
- POJ3321 Apple Tree
- POJ3321 Apple Tree
- poj3321_Apple Tree(树状数组)
- poj3321 Apple Tree
- [POJ3321] Apple Tree 苹果树 - 树状数组
- Apple Tree_poj3321_树状数组&dfs
- poj3321 Apple Tree
- 线段树 poj3321 Apple Tree
- POJ3321 Apple Tree
- POJ3321 Apple Tree
- Poj3321 Apple tree
- POJ3321-Apple Tree(dfs序+线段树)
- poj3321---Apple Tree
- POJ3321 Apple Tree
- POJ3321 Apple Tree(DFS序 + 树状数组)
- POJ3321 Apple Tree(DFS序+线段树)
- POJ3321:Apple Tree(树状数组)
- Apple Tree(POJ3321)(树状数组)