• 树状数组模板题:一本通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 }
  • 相关阅读:
    1、Python的初识与简介
    解密解密
    python看是32位还是64
    linux实战一段,安装python3(centos)
    前段技巧
    django后端safe和前端safe的方法
    测试
    python小知识整理
    ajax格式
    111
  • 原文地址:https://www.cnblogs.com/qianr/p/13253610.html
Copyright © 2020-2023  润新知