【模板】线段树区间修改、区间求和、查询最值
2017-11-01 07:54
369 查看
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #define ll long long #define lson num<<1,l,mid #define rson num<<1|1,mid+1,r using namespace std; const ll maxn=210000; ll n,m; ll tree[maxn<<2],treemin[maxn<<2],treemax[maxn<<2],lazy[maxn<<2],a[maxn]; void push_up(ll num) { tree[num]=tree[num<<1]+tree[num<<1|1]; treemin[num]=min(treemin[num<<1],treemin[num<<1|1]); treemax[num]=max(treemax[num<<1],treemax[num<<1|1]); } void push_down(ll num,ll len) { tree[num<<1]+=lazy[num]*(len-(len>>1)); treemin[num<<1]+=lazy[num]; treemax[num<<1]+=lazy[num]; lazy[num<<1]+=lazy[num]; tree[num<<1|1]+=lazy[num]*(len>>1); treemin[num<<1|1]+=lazy[num]; treemax[num<<1|1]+=lazy[num]; lazy[num<<1|1]+=lazy[num]; lazy[num]=0; } void build(ll num,ll l,ll r) { if(l==r) { tree[num]=treemin[num]=treemax[num]=a[l]; return; } ll mid=(l+r)>>1; build(lson);build(rson); push_up(num); return; } void update(ll L,ll R,ll delta,ll num,ll l,ll r) { if(L<=l&&r<=R) { tree[num]+=delta*(r-l+1); treemin[num]+=delta; treemax[num]+=delta; lazy[num]+=delta; return ; } if(lazy[num]) push_down(num,r-l+1); ll mid=(l+r)>>1; if(L<=mid) update(L,R,delta,lson); if(R>mid) update(L,R,delta,rson); push_up(num); return; } ll querymin(ll L,ll R,ll num,ll l,ll r) { if(L<=l&&r<=R) { return treemin[num]; } if(lazy[num]) push_down(num,r-l+1); ll mid=(r+l)>>1,ret=0x3f3f3f3f; if(L<=mid) ret=min(ret,querymin(L,R,lson)); if(R>mid) ret=min(ret,querymin(L,R,rson)); return ret; } ll querymax(ll L,ll R,ll num,ll l,ll r) { if(L<=l&&r<=R) { return treemax[num]; } if(lazy[num]) push_down(num,r-l+1); ll mid=(r+l)>>1,ret=0; if(L<=mid) ret=max(ret,querymax(L,R,lson)); if(R>mid) ret=max(ret,querymax(L,R,rson)); return ret; } ll query(ll L,ll R,ll num,ll l,ll r) { if(L<=l&&r<=R) { return tree[num]; } if(lazy[num]) push_down(num,r-l+1); ll mid=(l+r)>>1,ret=0; if(L<=mid) ret+=query(L,R,lson); if(R>mid) ret+=query(L,R,rson); return ret; }
相关文章推荐
- HDU - 3577 Fast Arrangement (线段树区间修改及查询模板题)
- 线段树模板(点修改 ,区间查询)
- P3372 【模板】线段树 1 区间查询与区间修改
- 线段树区间修改与查询(求和)
- 模板(线段树 + 树状数组 + 区间修改 + 区间查询)eg:POJ 3468 - A Simple Problem with Integers
- 敌兵布阵 HDU - 1166 (线段树单点修改区间求和模板)
- hdu 1166 线段树 单点修改 + 询问区间求和 (线段树模板)
- 线段树 区间求和模板 (区间修改)
- 基本线段树模板(建树、点/区间修改、查询)
- 【模板】线段树_区间最值、区间求和、修改
- [模板]-线段树-区间修改 + 区间查询
- POJ-3468 A Simple Problem with Integers (线段树 入门题 区间修改 区间查询)
- FOJ 2171 防守阵地 II 区间求和区间查询 线段树
- 1081 线段树练习 2 单点查询及区间修改
- 【树状数组】【单点修改区间求和】【区间修改单点查询】【单点修改区间最大值查询】
- P3373 【模板】线段树 2 区间求和 区间乘 区间加
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
- hihocoder 1078 线段树的区间修改线段树(区间修改 区间求和)
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
- 【线段树II:区间修改+点查询】hdu 1556 Color the ball