POJ---3468
2016-07-23 15:38
417 查看
Description 给出了一个序列,你需要处理如下两种询问。 "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。 "Q a b" 询问[a, b]区间中所有值的和。 Input 第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000. 第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。 接下来Q行询问,格式如题目描述。 Output 对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。 Sample Input 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 Sample Output 4 55 9 15 #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <vector> using namespace std; typedef long long LL; const int oo = 0xfffffff; const int maxn = 110007; #define lson rt<<1 #define rson rt<<1|1 int A[maxn]; struct da { int l, r; int len() { return r-l+1; } LL s, e; } tree[maxn<<2]; void build(int l, int r, int rt) { tree[rt].l = l; tree[rt].r = r; tree[rt].e = 0; if(l == r) { tree[rt].s = A[l]; return ; } int mid = (l+r)/2; build(l, mid, rt*2); build(mid+1, r, rson); tree[rt].s = tree[rt*2+1].s + tree[rt*2].s; } void down(int rt) { tree[rt*2].s+=tree[rt*2].len()*tree[rt].e; tree[rt*2+1].s+=tree[rt*2+1].len()*tree[rt].e; tree[rt*2].e+=tree[rt].e; tree[rt*2+1].e+=tree[rt].e; tree[rt].e=0; } void update(int l, int r, int val, int rt) { tree[rt].s += (r-l+1)*val; if(tree[rt].l == l && r==tree[rt].r) { tree[rt].e+=val; return ; } down(rt); int mid = (tree[rt].l+tree[rt].r)/2; if(r <= mid) update(l, r ,val, rt*2); else if(l>mid) update(l, r, val, rt*2+1); else { update(l, mid, val,rt*2); update(mid+1, r, val,rt*2+1); } } LL query(int l, int r, int rt) { if(tree[rt].l == l && r == tree[rt].r) { return tree[rt].s; } down(rt); int mid = (tree[rt].l+tree[rt].r)/2; if(r <= mid) return query(l, r, rt*2); else if(l > mid) return query(l, r, rt*2+1); else { LL lsum, rsum; lsum = query(l, mid, rt*2); rsum = query(mid+1, r, rt*2+1); return lsum+rsum ; } } int main() { int n, i, m, a, b, c, T; char op[20]; scanf("%d",&T); while(T--) { scanf("%d%d", &n,&m); for(i = 1; i <= n; i++) scanf("%d", &A[i]); build(1, n, 1); for(i=0; i<m; i++) { scanf("%s",op); scanf("%d %d", &a, &b); if(op[0] == 'Q') { printf("%I64d\n", query(a, b, 1)); } if(op[0] == 'C') { scanf("%d",&c); update(a, b, c, 1); } } } return 0; }
相关文章推荐
- 微信朋友圈广告开发总结
- UINavigationController 详解
- codeforces 701E E. Connecting Universities(树的重心)
- DP练习 - 机器分配
- ssh整合中web.xml配置文件
- Yii2简单实现多语言配置的方法
- Python:时间模块:time和datetime
- HDU----1689
- 【java项目】迁移到linux下
- Django部署(Nginx)
- OXWALL优化思路
- CSS Display(显示)和visibility(可见性)
- 一句话看懂getactivity和this区别
- QSDK art分区地址映射
- 杭电-2035 人见人爱A^B
- POJ 3087 Shuffle'm Up 简单的模拟题
- HDOJ 5363 Key Set
- okhttp3.0之快速入门教程
- mysql日志详细解析【转载】
- poj2187