博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3468 A Simple Problem with Integers(线段树 区间更新)
阅读量:6545 次
发布时间:2019-06-24

本文共 2311 字,大约阅读时间需要 7 分钟。

Description

You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.

The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

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

Sample Output

455915

线段树区间更新。

#include 
#include
#include
#include
#define lson o << 1, l, m#define rson o << 1|1, m+1, rusing namespace std;typedef long long LL;const int MAX=0x3f3f3f3f;const int maxn = 111111;int n, q, a, b, c;LL sum[maxn<<2], add[maxn<<2];void up(int o) { sum[o] = sum[o<<1] + sum[o<<1|1];}void down(int o, int m) { if(add[o] != 0) { add[o<<1] += add[o]; add[o<<1|1] += add[o]; sum[o<<1] += add[o]*(m-(m>>1)); sum[o<<1|1] += add[o]*(m>>1); add[o] = 0; }}void build(int o, int l, int r) { add[o] = 0; if(l == r) scanf("%I64d", &sum[o]); else { int m = (l+r) >> 1; build(lson); build(rson); up(o); }}LL query(int o, int l, int r) { if(a <= l && r <= b) return sum[o]; down(o, r-l+1); int m = (l+r) >> 1; LL ans = 0; if(a <= m) ans += query(lson); if(m < b) ans += query(rson); return ans;}void update(int o, int l, int r) { if(a <= l && r <= b) { add[o] += c; sum[o] += (LL)c*(r-l+1); return; } int m = (l+r) >> 1; down(o, r-l+1); if(a <= m) update(lson); if(m < b) update(rson); up(o);}int main(){ scanf("%d%d", &n, &q); build(1, 1, n); while(q--) { char op[3]; scanf("%s",op); if(op[0] == 'C') { scanf("%d%d%d", &a, &b, &c); update(1, 1, n); } else { scanf("%d%d", &a, &b); printf("%I64d\n", query(1, 1, n)); } } return 0;}



转载地址:http://gxrdo.baihongyu.com/

你可能感兴趣的文章
LVS 之 集群概念介绍
查看>>
数据库 之 MySQL的索引
查看>>
JS 获取随机颜色
查看>>
删除GoldenGate
查看>>
辞职后,五险一金如何处理
查看>>
全球域名注册商(国际域名)保有量及市场份额(6月1日)
查看>>
时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析
查看>>
URI,URL,URN
查看>>
java HTTPClient PostMethod 中文乱码问题解决方法
查看>>
URL特殊字符需转义
查看>>
Horizon7发布完整克隆模式后,无法登录问题
查看>>
No default constructor for entity
查看>>
IBM DS存储多路径
查看>>
java网络编程01
查看>>
字符串处理 - ANSI - Unicode - UTF8 转换
查看>>
一个×××老鸟的十年一梦----绝对真实!欢迎拍砖!
查看>>
Windows7搭建FTP服务器要点
查看>>
Linux 系统资源查看
查看>>
分步LVS: 详解利用Keepalived+Nginx解决站点高可用性
查看>>
Cocos2d-x3.2 UserDefault用户数据
查看>>