线段树模板 poj3468
来源:互联网 发布:企业级 选课系统 源码 编辑:程序博客网 时间:2024/06/01 20:32
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<bits/stdc++.h>using namespace std;typedef long long LL;const int N =200011;LL tree[N<<2];LL lazy[N<<2];LL a[N];void updata(int n){ tree[n]=tree[n<<1]+tree[n<<1|1];}void pushdown(int l,int r,int n){ if(lazy[n]) { int m=(l+r)>>1; lazy[n<<1]=lazy[n<<1]+lazy[n]; lazy[n<<1|1]=lazy[n<<1|1]+lazy[n]; tree[n<<1]=tree[n<<1]+(m-l+1)*lazy[n]; tree[n<<1|1]=tree[n<<1|1]+(r-m)*lazy[n]; lazy[n]=0; }}void build(int l,int r,int n){ lazy[n]=0; if(l==r) { tree[n]=a[l]; return ; } int m=(l+r)>>1; build(l,m,n<<1); build(m+1,r,n<<1|1); updata(n); return ;}LL query(int l,int r,int n,int a,int b){ if(l>=a&&r<=b) return tree[n]; pushdown(l,r,n); int m=(l+r)>>1; LL ans=0; if(a<=m) ans+=query(l,m,n<<1,a,b); if(b>m) ans+=query(m+1,r,n<<1|1,a,b); return ans;}void add(int l,int r,int n,int a,int b,LL k){ if(l>=a&&r<=b) { lazy[n]+=k; tree[n]=tree[n]+(r-l+1)*k; return ; } pushdown(l,r,n); int m=(l+r)>>1; if(a<=m) add(l,m,n<<1,a,b,k); if(b>m) add(m+1,r,n<<1|1,a,b,k); updata(n); return ;}int main(){ int n,m,i; while(scanf("%d",&n)!=EOF) { scanf("%d",&m); for(i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); char q; int l,r; LL k; while(m--) { scanf(" %c%d%d",&q,&l,&r); if(q=='Q') printf("%lld\n",query(1,n,1,l,r)); else if(q=='C') { scanf("%lld",&k); add(1,n,1,l,r,k); } } } return 0;}
- 线段树模板 poj3468
- POJ3468 线段树模板
- 线段树模板(poj3468)
- POJ3468 线段树-模板题
- poj3468 线段树成段更新模板
- POJ3468 区间加,区间求和 线段树模板
- POJ3468 A Simple Problem with Integers 线段树模板
- poj3468---线段树
- 线段树 poj3468
- poj3468之线段树
- 线段树--poj3468
- POJ3468 ZKW线段树
- poj3468(线段树)
- 线段树 pku poj3468
- 线段树-poj3468
- POJ3468 线段树
- poj3468(线段树)
- 线段树学习心得 poj3468
- Linux下实现定时器Timer的几种方法
- [编程题] 分苹果
- 莫比乌斯函数打表
- PLSQL:集合类型作为表列
- stm32 printf重定向
- 线段树模板 poj3468
- Js文件中文乱码问题
- js多层for循环嵌套如何一层一层终止
- 使用MySQL Workbench进行数据库设计——修改MySQL Schema的名称
- [转自用]ASCII码对应表(chr)
- C/C++中const关键字
- BZOJ 1053反素数ant
- Hbase安装出现的错误
- 微信二维码支付native原生支付开发模式二