zoukankan      html  css  js  c++  java
  • 树状数组模板题:一本通1535

     

     这道题是一道树状数组的模板题,主要考察树状数组的单点修改和区间求和的两种基本操作,只要写好对应的函数,按照读入的内容进行操作即可。首先写好lowbit、update、sum函数。因为之前已经写过了这些函数的写法,这里不再陈述。

    int lowbit(int x){
        return x&(-x);
    }
    void update(int x,int v){//在序列第x个位置加上a,并在数状数组中修改相关元素 
        while(x<=n){
            c[x]+=v;
            x+=lowbit(x);
        }
        return;
    }
    int sum(int x){//计算序列第一个位置到第x个位置的区间和 
        int res=0;
        while(x>0){
            res+=c[x];
            x-=lowbit(x);
        }
        return res;
    }

    然后写主函数即可。读入n、m,以及a数组来存储原数组。对树状数组c数组初始化为0,然后依次对a数组中的数进行update操作。接下来对于每一个操作输入k,若k=1,对第a个数进行update操作加b,若k=0,读入a和b,输出sum(b)-sum(a-1)的值即可。

    下面是完整代码:

     1 #include<cstdio>
     2 int c[100005];
     3 int n,m,op,a,b,v,i;
     4 int lowbit(int x){
     5     return x&(-x);
     6 }
     7 void update(int x,int v){//在序列第x个位置加上a,并在数状数组中修改相关元素 
     8     while(x<=n){
     9         c[x]+=v;
    10         x+=lowbit(x);
    11     }
    12 }
    13 void update(int x){
    14     int res=0;
    15     while(1){
    16         res+=c[x];
    17         x-=lowbit(x);
    18     }
    19     return res;
    20 }
    21 int main(){
    22     scanf("%d %d",&n,&m);
    23     for(i=1;i<=n;i++){
    24         scanf("%d",&v);
    25         update(i,v);
    26         //开始时每个元素初始值为0,读入序列时直接在对应位置加上v即可 
    27     }
    28     for(i=1;i<=m;i++){
    29         scanf("%d %d %d",&op,&a,&b);
    30         if(op==0){
    31             printf("%d
    ",sum(b)-sum(a-1));
    32         }else{
    33             update(a,b);
    34         }
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    容斥原理
    m元集A到n元集B的满射的个数
    二项式反演公式
    多项式定理
    组合数的基本性质
    Luogu P2408 不同子串个数
    Luogu P5410【模板】扩展 KMP
    Luogu P2336 [SCOI2012]喵星球上的点名
    Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
    Luogu P4248 [AHOI2013]差异
  • 原文地址:https://www.cnblogs.com/qianr/p/13253610.html
Copyright © 2011-2022 走看看