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 }
  • 相关阅读:
    C# 图形普通处理,resize ,水印..
    图像处理 形态学 (腐蚀 膨胀 开闭运算 连通分量....)
    获取usb设备父系或子代
    aforge通过角点匹配图片相似度
    CentOS 手动增加、删除swap区
    Zabbix 中文使用手册
    CentOS7下Firewall防火墙配置用法详解
    CentOS7安装Zabbix
    宅男也可变形男-我是如何在11个月零27天减掉80斤的
    CentOS环境下使用GIT基于Nginx的私服搭建全过程
  • 原文地址:https://www.cnblogs.com/qianr/p/13253610.html
Copyright © 2011-2022 走看看