您的位置:首页 > 移动开发

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: