原题链接:http://poj.org/problem?id=3468
专题链接:https://vjudge.net/contest/352439#problem/B
思路
本来是线段树的板子,奈何线段树太难打,头铁学了个树状数组来区间操作区间查询的方法
代码如下:
#include<iostream>
#include<cstdio>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
int N, Q;
ll arr[100001];
ll sum[100001];
ll tem[2][100001];
void update(int i, ll n,int flag)
{
while (i <= N)
{
tem[flag][i] += n;
i += lowbit(i);
}
}
ll get_sum(int i, int flag)
{
ll ans=0;
while (i)
{
ans += tem[flag][i];
i -= lowbit(i);
}
return ans;
}
int main()
{
cin >> N >> Q;
for (int i = 1; i <= N; i++)
{
scanf("%lld", &arr[i]);
sum[i] = sum[i - 1] + arr[i];
}
while (Q--)
{
char t;
ll l,r ;
scanf(" %c%lld%lld", &t, &l, &r);
if (t == 'C')
{
ll t1;
scanf("%lld", &t1);
update(l,t1,0);//差分思路
update(r+1,-t1,0);
update(l,t1*l,1);
update(r + 1, -t1 * (r + 1), 1);
}
else
{
ll ans=0;
ans += sum[r] + get_sum(r, 0) * (r + 1) - get_sum(r, 1);//第二项要*(i+1)
ans -= sum[l - 1] + get_sum(l - 1, 0) * l - get_sum(l-1, 1);
printf("%lld\n", ans);
}
}
return 0;
}