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 }
  • 相关阅读:
    Django 想要单独执行文件
    Django基础
    Bootstrap框架
    Font Awesome矢量图标框架
    js函数式编程——蹦床函数
    ie被hao.360劫持的解决方法
    函数式编程——惰性链
    你可能不知道的BFC在实际中的应用
    高度随宽度适应的响应式方案
    腾讯云播放器更新——TCplayer
  • 原文地址:https://www.cnblogs.com/InWILL/p/9846328.html
Copyright © 2011-2022 走看看