树状数组基本操作

前言

树状数组比线段树好写很多,虽然功能少点,但是有的时候已经可以满足一般题目的要求。

推荐一篇博客:https://bestsort.cn/2019/04/26/195/

我就是看着这个学的。

正文

第一节

这一节要实现的是单点修改和区间查询。

核心就是lowbit

int lowbit(x){return x&(-x);}

单点修改和区间查询都是基于lowbit来实现的。

单点修改代码
void update(int x,int y){//把第x个元素增加y
    for(int i=x;i<=n;i+=lowbit(i))//此处的n是你的元素的数量。
        c[i] += y;
}

区间查询代码
int getsum(int a)
{
    int ans=0;
    for(int i=a;i;i-=lowbit(i))
        ans+=q[i];
    return ans;
}

第二节

这节要实现的是区间修改和单点查询。

树状数组模板题2
#include<bits/stdc++.h>
using namespace std;
int q[500005],w[500005],n,m;
int lowbit(int a){return a&(-a);}
void add(int x,int y)
{
    for(int i=x;i<=n;i+=lowbit(i))
        w[i]+=y;
}
void qujian_add(int x,int y,int k){
    add(x,k);add(y+1,-k);
}
int ask(int a)
{
    int res=0;
    for(int i=a;i;i-=lowbit(i))
        res+=w[i];
    return res;
}
int main()
{
    int a,x,y,z;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>q[i];
        add(i,q[i]-q[i-1]);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>a;
        if(a==1)
        {
            cin>>x>>y>>z;
            qujian_add(x,y,z);
        }
        else if(a==2)
        {
            cin>>x;
            cout<<ask(x)<<endl;
        }
    }
}

本蒟蒻文笔不好,请大佬多多包涵

原文链接: https://www.cnblogs.com/iloveori/p/12525908.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    树状数组基本操作

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/374659

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月3日 下午12:15
下一篇 2023年3月3日 下午12:15

相关推荐