POJ 3468 A Simple Problem with Integers(线段树 成段更新)
来源:互联网 发布:淘宝宝贝介绍模板 编辑:程序博客网 时间:2024/06/05 21:50
题目链接:http://poj.org/problem?id=3468
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
Source
线段树成段更新 模板题就不多说了
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<map>#include<list>#include<set>#include<queue>#define LL long long#define lson l,m,rt<<1#define rson m+1,r,rt<<1 | 1using namespace std;const int maxn=100005;LL add[maxn<<2],sum[maxn<<2];void PushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void PushDown(int rt,int m){ if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=(m-(m>>1))*add[rt]; sum[rt<<1|1]+=(m>>1)*add[rt]; add[rt]=0; }}void build(int l,int r,int rt){ add[rt]=0; if(l==r) { scanf("%lld",&sum[rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); PushUp(rt);}void update(int L,int R,int x,int l,int r,int rt){ if(L<=l&&r<=R) { sum[rt]+=(LL)((r-l+1)*x); add[rt]+=(LL)x; return ; } PushDown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) update(L,R,x,lson); if(R>m) update(L,R,x,rson); PushUp(rt);}LL query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) { return sum[rt]; } PushDown(rt,r-l+1); int m=(l+r)>>1; LL ans=0; if(L<=m) ans+=query(L,R,lson); if(R>m) ans+=query(L,R,rson); return ans;}int main(){ int n,m,x,y,v; char op[5]; while(~scanf("%d%d",&n,&m)) { build(1,n,1); for(int i=0;i<m;i++) { scanf("%s",op); if(op[0]=='Q') scanf("%d%d",&x,&y),printf("%lld\n",query(x,y,1,n,1)); else scanf("%d%d%d",&x,&y,&v),update(x,y,v,1,n,1); } } return 0;}
- poj 3468 A Simple Problem with Integers(线段树|成段更新,区间查询)
- poj 3468 A Simple Problem with Integers(线段树,成段更新)
- POJ 3468 A Simple Problem with Integers 线段树 (成段更新)
- [ACM] 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 (线段树 - 成段更新)
- 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
- 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 (线段树,成段更新,区间求和)
- 快速创建和mysql表对应的java domain实体类 .
- 在java中生成验证码的问题
- ios开发中的基本设计模式 (简单归类)
- linux yum使用管理详细使用
- poj3254Corn Fields(状态压缩dp入门)
- POJ 3468 A Simple Problem with Integers(线段树 成段更新)
- 【各种最...】最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- Java多线程的交替执行
- drawrect的使用
- kerberos在redhat linux下的安装和配置
- 从系统分区镜像文件构建MBR
- Android 开发 之 JNI入门 - NDK从入门到精通
- java 读取本地文本文档的内容
- UISearchBar的属性和showsScopeBar