POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新
来源:互联网 发布:网络答题知识竞赛答案 编辑:程序博客网 时间:2024/04/29 20:07
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
思路:线段树区间跟新 + lazy-target标记
(注意数据范围,long long)
代码:
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<cstdio>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int maxn=100005;long long sum[maxn<<2];long long add[maxn<<2];void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void pushdown(int rt, int len) { if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=(len-(len>>1))*add[rt]; sum[rt<<1|1]+=(len>>1)*add[rt]; add[rt]=0; }}void build(int l, int r, int rt) { add[rt]=0; if(l==r) { scanf("%lld",&sum[rt]); return; } int mid=(l+r)>>1; build(lson); build(rson); pushup(rt);}void update(int L, int R, int val, int l, int r, int rt) { if(L<=l&&r<=R) { sum[rt]+=(r-l+1)*val; add[rt]+=val; return; } pushdown(rt,r-l+1); int mid=(l+r)>>1; if(L<=mid) update(L,R,val,lson); if(R>mid) update(L,R,val,rson); pushup(rt);}long long query(int L, int R, int l, int r, int rt) { if(L<=l&&r<=R) { return sum[rt]; } pushdown(rt,r-l+1); int mid=(l+r)>>1; long long cnt=0; if(L<=mid) cnt+=query(L,R,lson); if(R>mid) cnt+=query(L,R,rson); return cnt;}int main() { int n,q; while(~scanf("%d%d",&n,&q)) { build(1,n,1); char s[10]; for(int i=1;i<=q;i++) { scanf("%s",s); if(s[0]=='Q') { int L,R;long long result;scanf("%d%d",&L,&R); result=query(L,R,1,n,1); printf("%lld\n",result); } else if(s[0]=='C') { int L,R,val;scanf("%d%d%d",&L,&R,&val); update(L,R,val,1,n,1); } } } return 0;}
- POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新
- POJ 3468-A Simple Problem with Integers(线段树_区间更新+lazy标记)
- POJ 3468 A Simple Problem with Integers 线段树(区间更新,查询,lazy数组)
- poj 3468 A Simple Problem with Integers 【线段树 + 区间更新lazy】
- POJ 3468 A Simple Problem with Integers(段更新的区间求和&Lazy思想&线段树)
- POJ-3468-A Simple Problem with Integers(线段树区间维护 重写Lazy)
- Poj A Simple Problem with Integers(lazy线段树)
- poj 3468 A Simple Problem with Integers LAZY线段树
- poj 3468 A Simple Problem with Integers(线段树+lazy)
- 区间线段树-poj 3468-A Simple Problem with Integers
- A Simple Problem with Integers +poj+线段树区间更新
- HDU3468:A Simple Problem with Integers(线段树区间更新+lazy)
- POJ3468 A Simple Problem with Integers(线段树 lazy思想 区间查询更新)
- poj3468 A Simple Problem with Integers 线段树 区间更新 lazy
- POJ3468 A Simple Problem with Integers(线段树区间更新,lazy标记)
- POJ3468 A Simple Problem with Integers 【线段树+lazy】
- POJ_3468 A Simple Problem with Integers(线段树+lazy标记)
- poj3468 A Simple Problem with Integers 线段树lazy标签
- 词法分析器生成工具flex
- 搭建MyBatis框架
- MySQL建表,主键,外键
- 剑指Offer 15 输入一个链表,输出该链表中倒数第k个结点
- 跨服务器的复制操作
- POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新
- 子线程和子线程之间的通信
- ajax-review
- django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.的解决办法
- Python 爬虫 —— 爬取 IP && 快速验证
- 链表基础操作
- Ceph添加mon节点
- 二叉搜索树与双向链表
- POJ:3050 Hopscotch(DFS+set)