BZOJ3212: Pku3468 A Simple Problem with Integers
2018-02-08 20:42
316 查看
题目描述:
DescriptionYou 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<cstdio> #include<string> using namespace std; const int maxn=100005; int n,q; struct dyt{ int l,r; long long num,lazy; }tree[4*maxn]; inline int read(){ int x=0,flg=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') flg=-1; ch=getchar();} while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*flg; } void buildtree(int x,int l,int r){ tree[x].l=l,tree[x].r=r; int mid; if (l==r) return; else mid=(l+r)>>1; buildtree(x*2,l,mid); buildtree(x*2+1,mid+1,r); } void pushdown(int x){ int num=tree[x].lazy;tree[x].num+=1ll*(tree[x].r-tree[x].l+1)*tree[x].lazy,tree[x].lazy=0; if (tree[x].l==tree[x].r) return; tree[x*2].lazy+=num,tree[x*2+1].lazy+=num; } void put(int x,int l,int r,int num){ pushdown(x); if (tree[x].l==l&&tree[x].r==r) {tree[x].lazy=1ll*num; return;} int mid=(tree[x].l+tree[x].r)>>1; if (r<=mid) put(x*2,l,r,num); else if (l>mid) put(x*2+1,l,r,num); else {put(x*2,l,mid,num); put(x*2+1,mid+1,r,num);} tree[x].num+=1ll*(r-l+1)*num; } long long get(int x,int l,int r){ pushdown(x); if (tree[x].l==l&&tree[x].r==r) {return tree[x].num;} int mid=(tree[x].l+tree[x].r)>>1; if (r<=mid) return get(x*2,l,r); else if (l>mid) return get(x*2+1,l,r); else return get(x*2,l,mid)+get(x*2+1,mid+1,r); } int main(){ n=read(); q=read(); buildtree(1,1,n); for (int i=1;i<=n;i++) {int x=read(); put(1,i,i,x);} for (int i=1;i<=q;i++) { char ch=getchar(); while (ch!='C'&&ch!='Q') ch=getchar(); int x=read(),y=read(); if (ch=='C') {int z=read(); put(1,x,y,z);} else printf("%lld\n",get(1,x,y)); } return 0; }
相关文章推荐
- bzoj 3212: Pku3468 A Simple Problem with Integers
- [BZOJ3212] Pku3468 A Simple Problem with Integers
- 【分块】【线段树】bzoj3212 Pku3468 A Simple Problem with Integers
- bzoj3212 Pku3468 A Simple Problem with Integers
- BZOJ 3212 Pku3468 A Simple Problem with Integers
- BZOJ3212 Pku3468 A Simple Problem with Integers 题解
- BZOJ3212: Pku3468 A Simple Problem with Integers
- bzoj 3212: Pku3468 A Simple Problem with Integers (线段树)
- [BZOJ3212]Pku3468 A Simple Problem with Integers
- 3212: Pku3468 A Simple Problem with Integers
- 【bzoj 3212】【POJ 3468】A Simple Problem with Integers(线段树)
- 3212: Pku3468 A Simple Problem with Integers
- [PKU] 3468 A Simple Problem with Integers -- 线段树
- pku 3468 A Simple Problem with Integers
- pku 3468 A Simple Problem with Integers
- 线段树系列-pku-3468-A Simple Problem with Integers-区间修改区间求和
- pku -- 3468 A Simple Problem with Integers(线段树)
- PKU A Simple Problem with Integers 3468
- pku3468 A Simple Problem with Integers
- BZOJ3212 A Simple Problem with Integers