POJ-3468A Simple Problem with Integers(线段树区间修改)
来源:互联网 发布:世界十大网络病毒 编辑:程序博客网 时间:2024/06/10 19:51
A Simple Problem with Integers
Time Limit: 5000MS Memory Limit: 131072K
Total Submissions: 116429 Accepted: 36174
Case Time Limit: 2000MS
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.
Source
POJ Monthly–2007.11.25, Yang Yi
题意:
需要支持两种操作,区间求和,区间修改
线段树加lazy标记,就当写个版
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=2e5+5;int a[maxn]; LL T[4*maxn],tag[4*maxn],z; char opt[5];int L,R,x,y,n,m;inline void down(int l,int r,int k){ tag[k<<1]+=tag[k];tag[k<<1|1]+=tag[k]; int mid=(l+r)>>1; T[k<<1]+=(mid-l+1)*tag[k]; T[k<<1|1]+=(r-mid)*tag[k]; tag[k]=0;}inline void update(int k){ T[k]=T[k<<1]+T[k<<1|1];}inline void build(int l,int r,int k){ if(l==r) { T[k]=a[l]; tag[k]=0; return; } int mid=(l+r)>>1; build(l,mid,k<<1); build(mid+1,r,k<<1|1); update(k); tag[k]=0;}inline LL ask(int l,int r,int k){ if(L<=l&&r<=R)return T[k]; int mid=(l+r)>>1; down(l,r,k); LL res=0; if(L<=mid)res+=ask(l,mid,k<<1); if(R>mid)res+=ask(mid+1,r,k<<1|1); return res; }inline void add(int l,int r,int k){ if(L<=l&&r<=R) { tag[k]+=z; T[k]+=(r-l+1)*z; return ; } int mid=(l+r)>>1; down(l,r,k); if(L<=mid)add(l,mid,k<<1); if(R>mid)add(mid+1,r,k<<1|1); update(k);}int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;++i)scanf("%d",a+i); build(1,n,1); for(int i=1;i<=m;++i) { scanf("%s%d%d",opt,&x,&y); if(opt[0]=='Q') { L=x,R=y; printf("%lld\n",ask(1,n,1)); } else { scanf("%lld",&z); L=x,R=y; add(1,n,1); } } }}
- 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 3468A 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-3468A Simple Problem with Integers(线段树区间修改)
- 链接、装载与库
- Swift
- 为什么员工激励总达不到预期的效果?
- Java开发者值得关注的7款新工具
- Glide图片加载库详解
- POJ-3468A Simple Problem with Integers(线段树区间修改)
- Hyperledger Fabric Build
- Java 常用类库(二)
- python 并发测试
- 区块链开发(一)基于以太坊的私有链环境搭建介绍
- oppo(不root)手机查看万能钥匙破解的wifi密码实例
- java.util.concurrent包学习(一)锁的基本原理
- Linux常用命令集合(二)
- 前后端分离后的前端时代