POJ-3321-Apple Tree

来源:互联网 发布:ubuntu 杀死所有进程 编辑:程序博客网 时间:2024/05/21 07:55

这个题要求对苹果树进行更新与查找工作,先用DFS找出时间戳,然后树状数组进行更新操作即可

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=1e6+100;struct node{    int l;    int r;}t[maxn];int n,m,time,c[maxn*3],a[maxn],head[maxn],pnt[maxn],nxt[maxn],e;void addedge(int u,int v){    pnt[e]=v;nxt[e]=head[u];head[u]=e++;}void DFS(int u){    t[u].l=time;    for(int i=head[u];i!=-1;i=nxt[i])DFS(pnt[i]);    t[u].r=time++;}int lowbit(int x){    return x&(-x);}void change(int x){    if(a[x])for(int i=x;i<time;i+=lowbit(i))    c[i]++;    elsefor(int i=x;i<time;i+=lowbit(i))    c[i]--;}int  sum(int x){    int ans=0;    for(int i=x;i>0;ans+=c[i],i-=lowbit(i));    return ans;}int main(){    while(scanf("%d",&n)!=EOF)    {memset(head,-1,sizeof(head));e=0;time=1;for(int i=0;i<n-1;i++){    int u,v;    scanf("%d%d",&u,&v);    addedge(u,v);}DFS(1);scanf("%d",&m);for(int i=1;i<=n;i++){    a[i]=1;    change(i);}while(m--){    char op[3];    int ita;    scanf("%s%d",op,&ita);    if(op[0]=='Q')printf("%d\n",sum(t[ita].r)-sum(t[ita].l-1));    else    {a[t[ita].r]^=1;change(t[ita].r);    }}    }    return 0;}


原创粉丝点击