• 一维树状数组


    Apple Tree http://poj.org/problem?id=3321

     1 #include<cstdio>
     2 #include<cstring>
     3 #define mt(a,b) memset(a,b,sizeof(a))
     4 const int M=100010;
     5 struct G{
     6     struct E{
     7         int u,v,next;
     8     }e[M<<1];
     9     int le,head[M];
    10     void init(){
    11         le=0;
    12         mt(head,-1);
    13     }
    14     void add(int u,int v){
    15         e[le].u=u;
    16         e[le].v=v;
    17         e[le].next=head[u];
    18         head[u]=le++;
    19     }
    20 }g;
    21 struct P{
    22     int l,r;
    23 }p[M];
    24 int Clock;
    25 void dfs(int u,int fa){
    26     p[u].l=++Clock;
    27     for(int i=g.head[u];~i;i=g.e[i].next){
    28         int v=g.e[i].v;
    29         if(v!=fa){
    30             dfs(v,u);
    31         }
    32     }
    33     p[u].r=Clock;
    34 }
    35 class One_Tree_Array { //一维树状数组
    36     typedef int typev;
    37     typev a[M];
    38 public:
    39     void init() {
    40         mt(a,0);
    41     }
    42     int lowb(int t) {
    43         return t&(-t);
    44     }
    45     void add(int i,typev v) {
    46         for(; i<M; a[i]+=v,i+=lowb(i));
    47     }
    48     typev sum(int i) {
    49         typev s=0;
    50         for(; i>0; s+=a[i],i-=lowb(i));
    51         return s;
    52     }
    53 }gx;
    54 int now[M];
    55 int main(){
    56     int n,m,u,v;
    57     while(~scanf("%d",&n)){
    58         g.init();
    59         for(int i=0;i<n-1;i++){
    60             scanf("%d%d",&u,&v);
    61             g.add(u,v);
    62             g.add(v,u);
    63         }
    64         Clock=0;
    65         dfs(1,-1);
    66         scanf("%d",&m);
    67         gx.init();
    68         for(int i=1;i<=n;i++){
    69             now[i]=1;
    70             gx.add(i,1);
    71         }
    72         while(m--){
    73             char op[4];
    74             scanf("%s%d",op,&u);
    75             if(op[0]=='C'){
    76                 gx.add(p[u].l,-now[u]);
    77                 now[u]=-now[u];
    78             }
    79             else{
    80                 printf("%d
    ",gx.sum(p[u].r)-gx.sum(p[u].l-1));
    81             }
    82         }
    83     }
    84     return 0;
    85 }
    View Code

    end

  • 相关阅读:
    springboot配置jsp
    idea项目启动问题
    源码中的设计模式-模板方法模式
    Kafka Eagle CentOS6安装
    源码中的设计模式-静态代理模式
    MySQL主从复制小记
    源码中的设计模式-观察者模式
    源码中的设计模式-单例模式
    Superset
    Hive随记
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3884487.html
Copyright © 2020-2023  润新知