首页 > 其他分享 >树状数组

树状数组

时间:2022-11-03 19:45:22浏览次数:117  
标签:树状 int cin long add 数组 define op

单点修改,区间查询

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) (x&(-x))
const int N=5e5+10;
int a[N],s[N];
int n,m;
void add(int x,int k){
    for(int i=x;i<=n;i+=lowbit(i)){
        s[i]+=k;
    }
}
int searchs(int l,int r){
    int ans=0;
    for(int i=r;i;i-=lowbit(i)){
        ans+=s[i];
    }
    for(int i=l-1;i;i-=lowbit(i)){
        ans-=s[i];
    }
    return ans;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]);
    }
    while(m--){
        int op;
        cin>>op;
        if(op==1){
            int x,k;
            cin>>x>>k;
            add(x,k);
        }
        else{
            int l,r;
            cin>>l>>r;
            cout<<searchs(l,r)<<endl;
        }
    }
}

区间修改,单点查询

存储差分数组,在区间+k就是把l位置+k,r+1位置-k,然后单点查询就是查询1到x的和

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) (x&(-x))
const int N=5e5+10;
int a[N],s[N];
int n,m;
void add(int x,int k){
    for(int i=x;i<=n;i+=lowbit(i)){
        s[i]+=k;
    }
}
int searchs(int l,int r){
    int ans=0;
    for(int i=r;i;i-=lowbit(i)){
        ans+=s[i];
    }
    for(int i=l-1;i;i-=lowbit(i)){
        ans-=s[i];
    }
    return ans;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]-a[i-1]);
    }
    while(m--){
        int op;
        cin>>op;
        if(op==1){
            int x,y,k;
            cin>>x>>y>>k;
            add(x,k);
            add(y+1,-k);
        }
        else{
            int x;
            cin>>x;
            cout<<searchs(1,x)<<endl;
        }
    }
}

 

标签:树状,int,cin,long,add,数组,define,op
From: https://www.cnblogs.com/Dengpc/p/16855612.html

相关文章

  • 实验4 类与数组
    实验任务51#pragmaonce23#include<iostream>4#include<cassert>5usingstd::cout;6usingstd::endl;78classvectorInt9{10private:11......
  • 冒泡排序以及数组名相关内容
    voidbubble_sort(intarr[],intsz)//冒泡排序{inti=0;//确定冒泡排序的次数for(i=0;i<sz-1;i++){intflag=1;//假设这一趟要排序的数据已经全部......
  • 实验四 类与数组,指针
    一、实验结论:1.实验任务5:vectorint.hpp:#include<iostream>#include<iomanip>usingnamespacestd;classvectorint{public:vectorint(intn):size{n}......
  • C#中的二维数组及交叉数组
    在C语言中我们早就知道二维数组是如何声明定义的inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};  而在C#中二维数组却是这样声明定义的int[,]a={{1,2,3},{2,3,4......
  • React 函数组件
    React函数组件1、定义方式React函数组件是指使用函数方法定义的组件。定义方式:与函数的定义方式相同,需要将内容return出来,需要注意的是最外层只有一个标签或者使用......
  • 力扣-152-乘积最大的子数组
    对于dp[i],如果nums[i-1]>0,dp[i-1]也>0,那就是dp[i-1]*nums[i-1]如果<0,>0,那就是nums[i-1]0,<0,那就是nums[i-1]<0,<0,那就是dp[i-1]*nums[i-1]同样参考最大子数和,还需......
  • 树状数组(离线)
    对于一些询问左右区间的题可以把询问离线出来在按右端点排序用右端点从左往右扩计算当前右端点对所有左端点的贡献累加在左端点区间加可用差分来做然后用树状数组求答案......
  • WebSocket C#服务器端 当网页刷新时出现无法重连 C#出错:数字小于数组在第一维的下限。
    最近两天公司 要用到 WebSocketC#服务器端+Vue客户端我之前做 WebSocket 是 C#服务器端+原生js客户端原生js客户端 我用iframe 将 WebSocket 用单独一个网......
  • 【随想录跟学】数组(这是一个菜鸡重开的故事
    写在前面:本笔记是leetcode-master/数组理论基础.mdatmaster·youngyangyang04/leetcode-master(github.com)该github项目的跟学笔记。看我的没什么意义直接看原版吧。......
  • c语言中多维数组的指针表示
    c语言中多维数组的指针表示学c的时候碰见了下面这道题修改下面的程序,让它从数组计算变成指针计算:/*rain.c--findsyearlytotals,yearlyaverage,andmonthlyav......