树状数组模版+讲解-编程学习交流讨论版论坛-综合讨论-ZDZL
AI 文章摘要
本文介绍了树状数组(Binary Indexed Tree)的模板与核心原理。树状数组支持单点修改和区间求和,利用 `lowbit(x)` 实现高效更新与查询:`add(x,y)` 自下而上更新所有包含 `x` 的节点(`x += lowbit(x)`);`ask(x)` 从 `x` 向前累加前缀和(`x -= lowbit(x)`)。区间 `[l,r]` 的和通过 `ask(r) - ask(l-1)` 得到。代码简洁,适用于动态维护前缀和的场景。

树状数组模版+讲解

“`
#include<bits/stdc++.h>
using namespace std;

int n,q;
int a[500010],tree[500010]; //tree[i] = a[i-lowbit(i)+1,i] 的和

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

 

void add(int x,int y){
    //找父亲操作,给每个父亲全部加上 y
    //i 的父亲是 i+lowbit(i),即让 i 进位
    for(;x<=n;x+=lowbit(x)){
      tree[x]+=y;
    }
}
//[1,x] 区间的和
long long ask(long long x){
    //从后往前累加
    long long sum=0;
    for(;x;x-=lowbit(x))sum+=tree[x];

    return sum;
}

void solve(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
      cin>>a[i];
      add(i,a[i]);
    }   

    while(q–){
      int op,l,r;
      cin>>op>>l>>r;
      if(op==1)add(l,r);
      else {
        cout<<ask(r)-ask(l-1)<<endl;
      }
    }
}
int main(){
    solve();
}
“`

      • wcqk的头像-ZDZLwcqk徽章-ZDZL创始伙伴-ZDZL等级-LV4-ZDZL作者超级版主0