码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-07-12 11:58:25      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:int   scanf   两种   计算   mic   数组   开始   求和   loading   

技术图片

 

 技术图片

 这道题是一道树状数组的模板题,主要考察树状数组的单点修改和区间求和的两种基本操作,只要写好对应的函数,按照读入的内容进行操作即可。首先写好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\n",sum(b)-sum(a-1));
32         }else{
33             update(a,b);
34         }
35     }
36     return 0;
37 }

 

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

标签:int   scanf   两种   计算   mic   数组   开始   求和   loading   

原文地址:https://www.cnblogs.com/qianr/p/13253610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!