树状数组模板题:一本通1535

Posted qianr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组模板题:一本通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 }

 

以上是关于树状数组模板题:一本通1535的主要内容,如果未能解决你的问题,请参考以下文章

#10118 「一本通 4.1 练习 3」打鼹鼠

信奥一本通-树状数组模版题目-修改数列元素+求子数列元素和

[COGS 1535] [ZJOI2004]树的果实 树状数组+桶

一本通 P1806 计算器

几道树状数组的模板题

P3374 模板树状数组 1(单点修改区间查询)(树状数组)