poj3511--A Simple Problem with Integers(线段树求和)
来源:互联网 发布:全民k歌刷花软件 编辑:程序博客网 时间:2024/04/30 11:37
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
Hint
将一段的值增加c 求一段的和
将线段树的每一段表示它代表的那一段的和,统计结果时,要记录一段的所有的父节点的和,对该段会有影响
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 100000#define LL __int64#define lmin 1#define rmax n#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define now l,r,rt#define int_now LL l,LL r,LL rtLL cl[maxn<<2] , lazy[maxn<<2];void push_up(int_now){ cl[rt] = cl[rt<<1] + cl[rt<<1|1] + (r-l+1)*lazy[rt] ;}void push_down(int_now){}void creat(int_now){ cl[rt] = lazy[rt] = 0 ; if(l != r) { creat(lson); creat(rson); push_up(now); } else scanf("%I64d", &cl[rt]);}void update(LL ll,LL rr,LL x,int_now){ if( ll > r || rr < l ) return ; if( ll <= l && r <= rr ) { lazy[rt] += x ; cl[rt] += (r-l+1)*x ; return ; } update(ll,rr,x,lson); update(ll,rr,x,rson); push_up(now);}LL query(LL ll,LL rr,int_now,LL add){ if( ll > r || rr < l ) return 0; if( ll <= l && r <= rr ) return cl[rt] + ( r-l+1 )*add ; push_down(now); return query(ll,rr,lson,add+lazy[rt]) + query(ll,rr,rson,add+lazy[rt]) ;}int main(){ LL i , j , x , n , m ; char str[10] ; while(scanf("%I64d %I64d", &n, &m) !=EOF) { creat(root); while(m--) { scanf("%s", str); if(str[0] == 'C') { scanf("%I64d %I64d %I64d", &i, &j, &x); update(i,j,x,root); } else { scanf("%I64d %I64d", &i, &j); printf("%I64d\n", query(i,j,root,0)); } } } return 0;}
- poj3511--A Simple Problem with Integers(线段树求和)
- A Simple Problem with Integers(线段树,区间求和)
- A Simple Problem with Integers 【线段树】-区间加减求和
- Poj 3468 A Simple Problem with Integers (线段树 区间更新 区间求和)
- poj 3468 -- A Simple Problem with Integers ( 线段树 , 段更新 , 段求和 )
- POJ 3468 A Simple Problem with Integers(线段树区间更新+求和)
- poj 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
- POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)
- PKU A Simple Problem with Integers (线段树区间更新求和)
- POJ3468-A Simple Problem with Integers(线段树 成段更新求和)
- poj 3468 A Simple Problem with Integers(线段树的区间更新与求和)
- POJ-3468-A Simple Problem with Integers (线段树 区间求和)
- POJ 3468-A Simple Problem with Integers(线段树:成段更新,区间求和)
- 【POJ】A Simple Problem with Integers(线段树区间修增减求和)
- POJ 3468 A Simple Problem with Integers(线段树区间求和)
- POJ3468 A Simple Problem with Integers 线段树|树状数组BIT(区间增减,求和)
- poj 3468 A Simple Problem with Integers(线段树区间更新求和)
- POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)
- Oracle 游标
- pietty連CentOS時,中文部分是亂碼?
- 设置ORACLE客户端字符集
- 概述了有效的计划最佳的VPN服务提供商
- hdu-2091-空心三角形
- poj3511--A Simple Problem with Integers(线段树求和)
- 核心因素在荷兰VPN在美国
- 《后会无期》票房赶超《小时代3》 大数据解读韩寒VS四娘之争
- Users
- 揭秘传智播客班级毕业薪资超7k的内幕系列之五----首份12K Offer诞生,大专毕业生挑战高薪,为班级毕业薪资树立新标杆
- destoon中get_maincat函数的用法
- 网页标签图标
- 来往各地ISP流量整形与VPN
- Effective C# Item31:尽可能实现短小简洁的方法