zoukankan      html  css  js  c++  java
  • 树状数组模板

    一维树状数组:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int n,m;
     7 int a[500005];
     8 
     9 int lowbit(int x)
    10 {
    11     return x&(-x);
    12 }
    13 
    14 void update(int x,int k)
    15 {
    16     while(x<=n)
    17     {
    18         a[x]+=k;
    19         x+=lowbit(x);
    20     }
    21 }
    22 
    23 int sum(int x)
    24 {
    25     int ans=0;
    26     while(x)
    27     {
    28         ans+=a[x];
    29         x-=lowbit(x);
    30     }
    31     return ans;
    32 }
    33 
    34 int main()
    35 {
    36     scanf("%d%d",&n,&m);
    37     for(int i=1;i<=n;i++)
    38     {
    39         int x;
    40         scanf("%d",&x);
    41         update(i,x);
    42     }
    43     for(int i=1;i<=m;i++)
    44     {
    45         int z,x,y;
    46         scanf("%d%d%d",&z,&x,&y);
    47         if(z==1) update(x,y);
    48         else printf("%d
    ",sum(y)-sum(x-1));
    49     }
    50     return 0;
    51 }

     树状数组拓展:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int n,m;
     7 int a[500005];
     8 
     9 int lowbit(int x)
    10 {
    11     return x&(-x);
    12 }
    13 
    14 void update(int x,int k)
    15 {
    16     while(x<=n)
    17     {
    18         a[x]+=k;
    19         x+=lowbit(x);
    20     }
    21 }
    22 
    23 int sum(int x)
    24 {
    25     int ans=0;
    26     while(x)
    27     {
    28         ans+=a[x];
    29         x-=lowbit(x);
    30     }
    31     return ans;
    32 }
    33 
    34 int main()
    35 {
    36     scanf("%d%d",&n,&m);
    37     int last=0,now;
    38     for(int i=1;i<=n;i++)
    39     {
    40         scanf("%d",&now);
    41         update(i,now-last);
    42         last=now;
    43     }
    44     for(int i=1;i<=m;i++)
    45     {
    46         int z,x,y,k;
    47         scanf("%d",&z);
    48         if(z==1)
    49         {
    50             scanf("%d%d%d",&x,&y,&k);
    51             update(x,k);
    52             update(y+1,-k);
    53         }
    54         else
    55         {
    56             scanf("%d",&x);
    57             printf("%d
    ",sum(x));
    58         }
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    HDU6393(LCA + RMQ + 树状数组) n边图,两点最短距离 , 修改边权
    POJ 2763 (LCA +RMQ+树状数组 || 树链部分) 查询两点距离+修改边权
    HDU6396 (贪心+fread 挂)
    使用hadoop自带的例子作测试 笔记三
    hadoop的布暑方式 笔记二
    1 Hadoop原理介绍 笔记一
    ssh+flex
    openssh升级过程
    redhat5yum源配置
    struts2实现权限拦截
  • 原文地址:https://www.cnblogs.com/InWILL/p/9846328.html
Copyright © 2011-2022 走看看