JDOJ-1842: Magictree

1842: Magictree

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 583  Solved: 160
[Submit][Status][Web Board]

Description

Fox住在魔法岛上,他种了一排N棵魔法树(标号0..N-1,高度Ai),接下来的M天,每天Del都会来(Del是Fox的朋友),或者问Fox一些问题,或者帮助Fox对这些树施魔法.于是有两种形式:

    1.询问第a棵树到第b棵树的总高度
    2.对第a棵树到第b棵树施魔法,使它们长高c单位

Input

第一行,两个整数N,M

    第二行,N个整数,表示fox种的魔法树的初始高度

    接下来M行,有两种情况

    1.Q a b 表示询问a到b的高度和

    2.C a b c 表示对a到b施魔法c

Output

M行,对于每一个询问给出一个答案。

Sample Input

10 5 1 2 3 4 5 6 7 8 9 10 Q 3 3 Q 0 9 Q 1 3 C 2 5 3 Q 1 3

Sample Output

4 55 9 15

HINT

80%的数据保证    N<=100,M<=100

100%的数据保证 N<=2000000,M<=2000,0<=Ai<=100,0<=c<=250000000

总结:线段树模板
#include<bits/stdc++.h>

using namespace std;
#define ll long long 
const int maxn = 2000005;
int n, m; ll a[maxn];
ll sum[maxn << 2], laz[maxn << 2];

void build(int o, int l, int r) {
	if(l == r) {
		sum[o] = a[l]; return; 
	} int mid = (l + r) >> 1;
	build(o << 1, l, mid);
	build(o << 1 | 1, mid + 1, r);
	sum[o] = sum[o << 1] + sum[o << 1 | 1];
}
void pushdown(int o, int l, int r) {
	int mid = (l + r) >> 1;
	if(laz[o]) {
		laz[o << 1] += laz[o];
		laz[o << 1 | 1] += laz[o];
		sum[o << 1] += (mid - l + 1) * laz[o];
		sum[o << 1 | 1] += (r - mid) * laz[o];
		laz[o] = 0;
	}
}
ll query(int o, int l, int r, int ql, int qr) {
	if(ql <= l && r <= qr) return sum[o];
	ll res = 0; int mid = (l + r) >> 1;
	pushdown(o, l, r);
	if(ql <= mid) res += query(o << 1, l, mid, ql, qr);
	if(qr > mid) res += query(o << 1 | 1, mid + 1, r, ql, qr);
	return res;
}
void modify(int o, int l, int r, int ql, int qr, int c) {
	if(ql <= l && r <= qr) {
		sum[o] += (ll)(r - l + 1) * c; laz[o] += c;
		return;
	} int mid = (l + r) >> 1;
	pushdown(o, l, r);
	if(ql <= mid) modify(o << 1, l, mid, ql, qr, c);
	if(qr > mid) modify(o << 1 | 1, mid + 1, r, ql, qr, c);
	sum[o] = sum[o << 1] + sum[o << 1 | 1];
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
	build(1, 1, n); char ch[5];
	for (int i = 1; i <= m; ++i) {
		int l, r; ll c;
		scanf("%s", &ch[0]); scanf("%d%d", &l, &r); l++, r++;
		if(ch[0] == 'Q') printf("%lld\n", query(1, 1, n, l, r));
		else {scanf("%lld", &c); modify(1, 1, n, l, r, c);}
	}
	
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/oi-forever/p/8922270.html