1842: Magictree
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 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; }