POJ 3468 A Simple Problem with Integers
来源:互联网 发布:seo查询 编辑:程序博客网 时间:2024/05/22 12: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 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
Hint
The sums may exceed the range of 32-bit integers.
一道线段树的模板题,题目大意:建立一棵线段树,支持区间加法,区间求和。
#include<iostream>#include<cstdio>using namespace std;const int maxn=100000;struct node{ int l,r; long long sum,tmp;}tree[4*maxn+1];int n,q,data[maxn+1];void build(int l,int r,int num){ tree[num].l=l; tree[num].r=r; if(l==r) { tree[num].sum=data[l]; return ; } int mid=(l+r)/2; build(l,mid,2*num); build(mid+1,r,2*num+1); tree[num].sum=tree[2*num].sum+tree[2*num+1].sum;}void update(int num){ tree[2*num].tmp+=tree[num].tmp; tree[2*num].sum+=tree[num].tmp*(tree[2*num].r-tree[2*num].l+1); tree[2*num+1].tmp+=tree[num].tmp; tree[2*num+1].sum+=tree[num].tmp*(tree[2*num+1].r-tree[2*num+1].l+1); tree[num].tmp=0;}void add(int l,int r,int x,int num){ if(tree[num].l>r||tree[num].r<l) return ; if(tree[num].l>=l&&tree[num].r<=r) { tree[num].tmp+=x; tree[num].sum+=x*(tree[num].r-tree[num].l+1); return ; } if(tree[num].tmp) update(num); add(l,r,x,2*num); add(l,r,x,2*num+1); tree[num].sum=tree[2*num].sum+tree[2*num+1].sum;}long long find_sum(int l,int r,int num){ if(tree[num].l>r||tree[num].r<l) return 0; if(tree[num].l>=l&&tree[num].r<=r) return tree[num].sum; if(tree[num].tmp) update(num); return find_sum(l,r,2*num)+find_sum(l,r,2*num+1);}int main(){ char ch; scanf("%d%d",&n,&q); for(int i=1;i<=n;++i) scanf("%d",data+i); build(1,n,1); for(int i=1;i<=q;i++) { int a,b,c; cin>>ch; if(ch=='C') { scanf("%d%d%d",&a,&b,&c); add(a,b,c,1); } else { scanf("%d%d",&a,&b); printf("%lld\n",find_sum(a,b,1)); } } return 0;}
- 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
- poj 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers
- poj 3468 A Simple Problem with Integers
- 字典表流程
- 文本框 12种炫酷HTML5 SVG和CSS3表单浮动标签特效
- 磁盘inode和block
- UVA - 10106 Product
- HDU3410 Passing the Message (单调队列,线段树可解)
- POJ 3468 A Simple Problem with Integers
- 算法的复杂度概念
- elipse下github的安装和使用
- 字符串匹配的Boyer-Moore算法----改算法优于KMP算法
- Oracle中*和其他字段组合查询的说明
- 关于VS2005与Vs2008的比较
- 按位“或”运算符 (|)
- 报表展现部件:设置子报表业务表变量值
- 把时间由TIMESTAMP类型改为String类型