拓展
作用:1、改一个区间的值;2、查某一个值
思路:引入一个差分数组即可
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
int tr[N] , a[N];
int n , m;
int lowbit(int x)
{
return x & -x;
}
void add(int x ,int c)
{
for(int i = x ; i <= n ; i += lowbit(i)) tr[i] += c;
}
int sum(int x)
{
int res = 0;
for(int i = x ; i ; i -= lowbit(i)) res += tr[i];
return res;
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i++) cin >> a[i];
for(int i = 1 ; i <= n ; i++) add(i , a[i] - a[i - 1]);//在i这个位置插入a[i]的差分
while(m--)
{
char op[2];
int l , r , d;
cin >>op;
if(*op == 'C')
{
cin >> l >> r >> d;
add(l , d) , add(r + 1 , -d);
}
else
{
cin >> d;
cout << sum(d) << endl;
}
}
return 0;
}
大佬,tr[]就是 咱们说的b[]: 差分数组 对吗
对
为啥是差分啊
因为树状数组最基本的功能是点单修改单点查询,我们可以通过转换为差分的方式实现区间修改(比如将区间
[l,r]
都加d
,就是将差分数组的b[l] += d,b[r+1] -= d
)这题是把
区间增加
和单点查询
变为了树状数组擅长的单调修改
和区间查询