题目链接:https://www.luogu.com.cn/problem/P3368
题目描述:

思路:
正如题目名字,树状数组模板题。
数组数组的详细讲解请看这位大佬的讲解:https://www.cnblogs.com/xenny/p/9739600.html
我在此不再多赘述。
ac代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500005;
int a[maxn],c[maxn];
int n;
//********下面为***树形数组的操作*****
int lowbit(int x){
return x&(-x);
}
void update(int i,int k){
while(i <= n){
c[i] += k;
i += lowbit(i);
}
}
int getsum(int i){
int ans = 0;
while(i > 0){
ans += c[i];
i -= lowbit(i);
}
return ans;
}
//********上面为***树形数组的操作*****
int main(){//树形数组:区间更新,单点查询
int m;
cin>>n>>m;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(int i = 1;i <= n;i++){
cin>>a[i];
update(i,a[i]-a[i-1]);//存入差值
}
int a,b,c,d;
while(m--){
cin>>a;
if(a==1){//更新区间
cin>>b>>c>>d;
update(b,d);
update(c+1,-d);
}else{
cin>>b;
cout<<getsum(b)<<endl;
}
}
return 0;
}
本文深入解析了一道树状数组模板题,通过实例详细介绍了树状数组的使用方法,包括差分更新和区间查询等核心操作。文章提供了完整的AC代码,并附带了对树状数组原理的讲解链接。
555

被折叠的 条评论
为什么被折叠?



