带封装题解,喜欢给一个赞 ver 1.0
2025-08-04 11:42:52
发布于:上海
3阅读
0回复
0点赞
封装功能
TreeArrayD:树状数组维护差分
lowbit:查找i在二进制下的最低位1的权重
update:单点修改(将位置p的元素增加x)
init:初始化树状数组维护差分
maintain:维护树状差分(区间[l,r]增加x)
ask:前缀和查询∑(k,i=1)a_i
query:单点查询位置id的值
#include<bits/stdc++.h>
using namespace std;
const int _N=5e5+5;
struct TreeArrayD{
int f[_N]={},st[_N];
int n;
int lowbit(int x){
return x & (-x);
}
void update(int p,int x){
while(p<=n){
f[p]+=x;
p+=lowbit(p);
}
return;
}
void init(int a[],int l){
f[0]=0;
n=l;
for(int i=1;i<=n;i++){
st[i]=a[i];
}
}
void maintain(int l,int r,int x){
update(l,x);
update(r+1,-x);
}
int ask(int k){
int res=0;
while(k>0){
res+=f[k];
k-=lowbit(k);
}
return res;
}
int query(int id){
return ask(id)+st[id];
}
};
int main(){
int n,m;
cin>>n>>m;
TreeArrayD t;
int a[_N];
for(int i=1;i<=n;i++){
cin>>a[i];
}
t.init(a,n);
while(m--){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
t.maintain(x,y,k);
}
else{
int id;
cin>>id;
cout<<t.query(id)<<endl;
}
}
}
这里空空如也
有帮助,赞一个