[poj 3468] A Simple Problem with Integers(裸线段树)


水题,只要注意结果是long long就行了。

#include<iostream>
using namespace std;

#define maxn 100010
struct node
{
int l;
int r;
long long add;
long long sum;
}tree[maxn * 4];

long long num[maxn];

void down(int num)
{
tree[num<<1].sum += tree[num].add*(tree[num<<1].r - tree[num<<1].l + 1);
tree[num<<1|1].sum += tree[num].add*(tree[num<<1|1].r - tree[num<<1|1].l + 1);
tree[num<<1].add += tree[num].add;
tree[num<<1|1].add += tree[num].add;
tree[num].add = 0;
}

void build(int l, int r, int root)
{
tree[root].l = l;
tree[root].r = r;
tree[root].add = 0;
if(l == r)
{
tree[root].sum = num[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, root<<1);
build(mid + 1, r, root<<1|1);
tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
}

void update(int l, int r, int num, int root)
{
if(l <= tree[root].l && tree[root].r <= r)
{
tree[root].add += num;
tree[root].sum += num*(tree[root].r - tree[root].l + 1);
return;
}
if(tree[root].add)
down(root);
int mid = (tree[root].l + tree[root].r) >> 1;
if(l <= mid)
update(l, r, num, root<<1);
if(r > mid)
update(l, r, num, root<<1|1);
tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
}

long long query(int l, int r, int root)
{
if(l <= tree[root].l && tree[root].r <= r)
{
return tree[root].sum;
}
if(tree[root].add)
down(root);
int mid = (tree[root].l + tree[root].r) >> 1;
long long ans1 = 0, ans2 = 0;
if(l <= mid)
ans1 = query(l, r, root<<1);
if(r > mid)
ans2 = query(l, r, root<<1|1);
return ans1 + ans2;
}

int main()
{
int n, q;
char ch;
int a, b, c;
while(~scanf("%d%d", &n, &q))
{
for(int i = 1; i <= n; i++)
scanf("%lld", &num[i]);
build(1, n, 1);
while(q--)
{
getchar();
scanf("%c%d%d", &ch, &a, &b);
if(ch == 'C')
{
scanf("%d", &c);
update(a, b, c, 1);
}
else
{
printf("%lld\n", query(a, b, 1));
}
}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值