洛谷P3372 【模板】线段树 1(lazy)
来源:互联网 发布:celling sql 编辑:程序博客网 时间:2024/06/06 02:19
【模板】线段树 1
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式:
输出包含若干行整数,即为所有操作2的结果。
分析:lazy。。。
代码
#include <cstdio>#define maxn 1000000#define ll long long using namespace std;struct tnode{ int l,r; ll s,lazy;}t[maxn];int a[maxn],n,m;void build(int p){ if (t[p].l==t[p].r) { t[p].s=a[t[p].l]; return; } int mid=(t[p].l+t[p].r)/2; t[p*2].l=t[p].l; t[p*2].r=mid; t[p*2+1].l=mid+1; t[p*2+1].r=t[p].r; build(p*2); build(p*2+1); t[p].s+=t[p*2].s+t[p*2+1].s;}void push(int p){ t[p*2].lazy+=t[p].lazy; t[p*2+1].lazy+=t[p].lazy; t[p].s+=(t[p].r-t[p].l+1)*t[p].lazy; t[p].lazy=0;}void change(int p,int x,int y,ll k){ if (t[p].l==x&&t[p].r==y) { t[p].lazy+=k; return; } int mid=(t[p].l+t[p].r)/2; if (y<=mid) change(p*2,x,y,k); else if (x>mid) change(p*2+1,x,y,k); else { change(p*2,x,mid,k); change(p*2+1,mid+1,y,k); } t[p].s=t[p*2].s+t[p*2+1].s; t[p].s+=(t[p*2].r-t[p*2].l+1)*t[p*2].lazy; t[p].s+=(t[p*2+1].r-t[p*2+1].l+1)*t[p*2+1].lazy;}ll find(int p,int x,int y){ if (t[p].l==x&&t[p].r==y) return t[p].s+(t[p].r-t[p].l+1)*t[p].lazy; push(p); int mid=(t[p].l+t[p].r)/2; if (y<=mid) return find(p*2,x,y); if (x>mid) return find(p*2+1,x,y); return find(p*2,x,mid)+find(p*2+1,mid+1,y);}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); t[1].l=1; t[1].r=n; build(1); for (int i=1;i<=m;i++) { int v,x,y; scanf("%d%d%d",&v,&x,&y); if (v==1) { ll k; scanf("%lld",&k); change(1,x,y,k); } else printf("%lld\n",find(1,x,y)); }}
阅读全文
0 0
- 洛谷P3372 【模板】线段树 1(lazy)
- 【洛谷P3372】【模板】线段树 1
- 洛谷 P3372【模板】线段树 1
- 洛谷P3372 【模板】线段树 1
- 洛谷 P3372 【模板】线段树 1
- 【洛谷P3372】【模板】线段树1
- 洛谷P3372线段树模板1(改段求段)
- 洛谷 P3372 线段树模板
- [P3372][模板]线段树1
- 【洛谷】P3372线段树1 线段树模板
- 【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)
- 【模板】线段树 区间加,区间求和 (模板题:P3372线段树1)
- 洛谷 P3372 线段树 1(树状数组做法)
- 洛谷p3372 线段树模版
- Luogu-P3372 (Lazy_tag 线段树模板)
- 关于 线段树 下传(AC) 不做标记 下传(T3)模板洛谷p3372
- 线段树模板(lazy标记)ZOJ 3686
- poj 3237 树链剖分模板(用到线段树lazy操作)
- SpaceX成功发射卫星后被军方“盯上了”,未来有可能引入政府资金?
- 库克回应:苹果为何拒付高通专利费?
- Git的使用--如何将本地项目上传到GitHub
- 字符串函数的用法
- 阿里“NASA计划”速度惊人:全球首个光量子计算机诞生
- 洛谷P3372 【模板】线段树 1(lazy)
- 水滴直播强制商家在直播区进行提示 尽到监督告知义务
- 百度更新使命:用科技让复杂的世界更简单
- IDC:华为超OPPO成中国市场第一,苹果、小米下跌
- 为了从谷歌、微软等挖角,BAT都使出了哪些奇招?
- 专访高通全球副总裁沈劲:“低谷中的前沿科技”该怎么投?
- 第二届CE China开幕,德系和国产家电厂商分别展示了什么?
- 百家企业报名「2017新智造成长榜」,下一个AI独角兽会是你吗?
- 关于HTML中超链接的下划线的取消的方式