洛谷 3372_【模板】线段树 1_线段树
来源:互联网 发布:ubuntu论坛 编辑:程序博客网 时间:2024/04/30 00:31
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
思路
加lazy的线段树
#include <stdio.h>#define maxn 1000000#define max(x,y) x>y?x:y#define min(x,y) x<y?x:y#define INF 0x7f7f7f7f#define LL long longstruct tree{ LL x,lazy;}t[maxn*5];int a[maxn*5];inline int read(){ int x=0,p=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-')p=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*p;}int k=0;int pushdown(int p,int len){ t[p<<1].lazy+=t[p].lazy; t[p<<1|1].lazy+=t[p].lazy; t[p<<1].x+=t[p].lazy*(len-len/2); t[p<<1|1].x+=t[p].lazy*(len/2); t[p].lazy=0;}int make(int p,int l,int r){ int m=(l+r)>>1; if (l==r) { k++; t[p].x=a[k]; return 0; } make(p<<1,l,m); make(p<<1|1,m+1,r); t[p].x=t[p<<1].x+t[p<<1|1].x;}int insert(int p,int l,int r,int x,int y,int k){ int m=(l+r)>>1; if (x<=l&&y>=r) { t[p].lazy+=k; t[p].x+=(r-l+1)*k; return 0; } if (t[p].lazy) pushdown(p,r-l+1); if (y<=m) insert(p<<1,l,m,x,y,k); else if (x>m) insert(p<<1|1,m+1,r,x,y,k); else { insert(p<<1,l,m,x,m,k); insert(p<<1|1,m+1,r,m+1,y,k); } t[p].x=t[p<<1].x+t[p<<1|1].x;}LL find(int p,int l,int r,int x,int y){ int m=(l+r)>>1; if (x<=l&&y>=r) return t[p].x; if (t[p].lazy) pushdown(p,r-l+1); if (y<=m) return find(p<<1,l,m,x,y); else if (x>m) return find(p<<1|1,m+1,r,x,y); else return find(p<<1,l,m,x,m)+find(p<<1|1,m+1,r,m+1,y);}int main(){ int n=read(),m=read(); for (int i=1;i<=n;i++) a[i]=read(); make(1,1,n); for (int i=1;i<=m;i++) { int z=read(),x=read(),y=read(); if (z==1) { int xx=read(); insert(1,1,n,x,y,xx); } else printf("%lld\n",find(1,1,n,x,y)); }}
1 1
- 洛谷 3372_【模板】线段树 1_线段树
- 线段树_模板
- 模板_线段树
- ACM_模板_线段树
- 数据结构_线段树_基础模板
- 线段_线段树
- 线段_线段树
- 线段树_总结
- 箱子_线段树
- 箱子_线段树
- 线段树_初步
- jzoj 1278_排队_线段树
- 【模板】线段树_区间最值、区间求和、修改
- jzoj 1379_【线段树】最大值_线段树
- SSL 2646_线段树练习题三_线段树
- SSL 2647_线段树练习四_线段树
- 【模板】线段树 洛谷 3372 线段树
- 线段树_单点更新
- 文章标题
- STL之Vector(Linux内核)完整实现
- 第六章 选择结构程序设计
- P1508 Likecloud-吃、吃、吃
- Python笔记-文本字符串格式化
- 洛谷 3372_【模板】线段树 1_线段树
- hibernate学习(1):hibernate基本架构和关系映射详解
- 网站日志统计案例分析与实现
- 图解.NET Stack和Heap的本质区别
- 在Ubuntu中安装Apache服务器(使用openjdk java)
- 分类算法系列2----逻辑回归Logistic原理和Python实现
- Linux greb
- 求一亿个数字里面最小的10个数字
- 分解质因数