【模板】线段树
来源:互联网 发布:linux sleep时可以 编辑:程序博客网 时间:2024/06/05 00:13
int val[MAXN];struct tree{ int maxx,sum; int add; tree() {maxx=sum=add=0;}}use[MAXN*4];//[ lc(x); rc(x); ]inline int lc(int x){ return x << 1;}inline int rc(int x){ return x << 1 | 1;}//[ up(x); ]inline void up(int x){ int l=lc(x),r=rc(x); use[x].maxx=max(use[l].maxx,use[r].maxx); use[x].sum=use[l].sum+use[r].sum; }//[ down(x); ]//inline max_down(int x){ if(use[x].add!=0) { int l=lc(x),r=rc(x); use[l].maxx+=use[x].add; use[r].maxx+=use[x].add; use[l].add+=use[x].add; use[r].add+=use[x].add; use[x].add=0; } }//[ down(x,r-l+1); ]inline sum_down(int x,int len){ //len=r-l+1 if(use[x].add!=0) { int l=lc(x),r=rc(x); use[l].sum+=use[x].add*(len-(len>>1)); use[r].sum+=use[x].add*(len>>1); use[l].add+=use[x].add; use[r].add+=use[x].add; use[x].add=0; } }//[ build(1,1,n); ]</span>void build(int x,int l,int r){ if(l==r) { use[x].maxx=use[x].sum=val[l]; return ; } int mid=(l+r)>>1; build(lc(x),l,mid); build(rc(x),mid+1,r); up(x);}//[ updata(1,1,n,l,r,v); ]void updata(int x,int l,int r,int op,int ed,int v){ if(op<=l&&r<=ed) { use[x].sum+=v*(r-l+1); use[x].maxx+=v; use[x].add+=v; return ; } down(x); //根据情况选择函数和参数(max or sum)</span></span> int mid=(l+r)>>1; if(ed<=m)updata(lc(x),l,mid,op,ed,v); else if(op>mid)updata(rc(x),mid+1,r,op,ed,v); else { updata(lc(x),l,mid,op,ed,v); updata(rc(x),mid+1,r,op,ed,v); } up(x);}<span style="font-size:18px;color:#FF0000;">[ query(1,1,n,l,r); ]<span style="color:#993399;">int query(int x,int l,int r,int op,int ed){ if(op<=l&&r<=ed) { //max: return use[x].maxx; //sum: return use[x].sum; } down(x); //根据情况选择函数和参数(max or sum) int mid=(l+r)>>1; if(ed<=mid)return query(lc(x),l,mid,op,ed); else if(op>mid)return query(rc(x),mid+1,r,op,ed); else { //max: return max( query(lc(x),l,mid,op,ed) , query(rc(x),mid+1,r,op,ed) ); //sum: return query(lc(x),l,mid,op,ed) + query(rc(x),mid+1,r,op,ed); } }
0 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 菜鸟之路 之 C# 通过特殊符号截取每段字符串
- 单调递增最长子序列(动态规划)
- android简单实例--------------------3种特殊dialog的使用,单选、多选、适配器dialog对话框
- iOS 【iOS ViewController的跳转形式 Present ViewController Modally】
- 多态经典面试题
- 【模板】线段树
- android:自定义HorizontalScrollView实现qq侧滑菜单
- ANDROID内存优化
- 身份证识别,银行卡识别,名片识别
- 简单的java Socket 例子
- Java 入门 之 聊天室项目思路 服务器端
- iOS开发多线程---GCD的介绍和简单使用
- iOS 【iOS-PresentViewController切换界面 Modal】
- 高斯金字塔 matlab程序实现