POJ 3468 线段树(区间更新)
来源:互联网 发布:seo站外优化方法 编辑:程序博客网 时间:2024/04/29 08:56
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
线段树的区间更新,代码量比较大,写的时候容易出错。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 100005 ;struct node{ int l,r; long long sum,add ;};node tree[3*maxn] ;int N,q;void build(int i,int l,int r){ tree[i].l=l; tree[i].r=r; tree[i].add=0; tree[i].sum=0; if(l==r)return ; int mid = (l+r)/2 ; build(2*i,l,mid); build(2*i+1,mid+1,r);}void pushdown(int i,int l,int r){ int mid = (l+r)/2 ; tree[2*i].add+=tree[i].add ; tree[2*i+1].add+=tree[i].add ; tree[2*i].sum+=tree[i].add*(mid-l+1) ; tree[2*i+1].sum+=tree[i].add*(r-mid) ; tree[i].add=0 ;}void update(int i,int l,int r,int yl,int yr,long long v){ if(yl<=l&&r<=yr){ tree[i].add+=v; tree[i].sum+=v*(r-l+1) ; }else{ int mid=(l+r)/2 ; pushdown(i,l,r) ; if(yl<=mid)update(2*i,l,mid,yl,yr,v); if(mid<yr)update(2*i+1,mid+1,r,yl,yr,v); tree[i].sum=tree[2*i].sum+tree[2*i+1].sum ; }}long long query(int i,int l,int r,int ql,int qr){ long long ret = 0 ; if(ql<=l&&r<=qr){ return tree[i].sum ; }else{ int mid = (l+r)/2 ; pushdown(i,l,r) ; if(ql<=mid)ret+=query(2*i,l,mid,ql,qr); if(mid<qr)ret+=query(2*i+1,mid+1,r,ql,qr) ; return ret ; }}int main(){ while(~scanf("%d%d",&N,&q)){ memset(tree,0,sizeof(tree)); build(1,1,N); for(int i=1;i<=N;i++){ int a ; scanf("%d",&a); update(1,1,N,i,i,a); } for(int i=0;i<q;i++){ int a,b,c; char str[10] ; scanf("%s",str); if(str[0]=='C'){ scanf("%d %d %d",&a,&b,&c); update(1,1,N,a,b,c); }else{ scanf("%d%d",&a,&b); printf("%I64d\n",query(1,1,N,a,b)); } } } return 0;}
- POJ 3468 线段树(区间更新)
- POJ-3468(线段树区间更新区间查询)
- POJ 3468 线段树 区间更新
- POJ-3468(线段树_区间更新)
- 线段树 : 区间更新 poj 3468 示例
- 线段树 : 区间更新 poj 3468 示例
- poj 3468 线段树区间更新维护
- poj 3468 线段树区间更新
- poj 3468(简单线段树区间更新)
- POJ 3468 线段树区间更新
- POJ 3468 线段树区间更新
- poj 3468 线段树区间更新
- POJ 3468(线段树区间更新)
- POJ 3468 线段树 区间更新
- poj-3468-线段树,区间更新
- Poj 3468 线段树的区间更新
- poj 3468 线段树(区间更新
- poj 3468 线段树区间更新lazy
- 102 - Binary Tree Level Order Traversal(BFS)
- Activity之间传递Bitmap,将Bitmap转换为Byte数组后传递
- 关于performSelector调用和直接调用区别
- 【SettingsProvider】修改系统初始化时间与日期的格式
- 形态学运算中腐蚀,膨胀,开运算和闭运算
- POJ 3468 线段树(区间更新)
- Linux BOOT 空间扩展
- Android中Animation动画的介绍及用法
- c++程序设计笔记(2)
- 【CSS-01】CSS中Margin布局
- 【百度面试题】把数组排成最小的数
- linux内核PID管理--命名空间
- HTTP 协议访问网络
- SQL多行合并一列