存一下线段树模板
2016-07-06 22:41
316 查看
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1 |1 using namespace std; const int mxn=100020; int data[mxn*4]; int tre[mxn],mini[mxn]; int add[mxn];//懒标记 void pushup(int rt){ mini[rt]=min(mini[rt<<1],mini[rt<<1 |1]); } void pushdown(int rt){//向下传递lazy标记 if(add[rt]!=0){ add[rt<<1]+=add[rt]; add[rt<<1 |1]+=add[rt]; mini[rt<<1]+=add[rt]; mini[rt<<1 |1]+=add[rt]; add[rt]=0;//标记传递完毕,清除 } return; } void Build(int l,int r,int rt){//建树 if(l==r){ mini[rt]=data[l]; return; } int mid=(l+r)>>1; Build(ls);Build(rs); pushup(rt); return; } void update_point(int p,int x,int l,int r,int rt){//单点更新 if(l==r){ mini[rt]=x; return; } int mid=(l+r)>>1; if(p<=mid)update_point(p,x,ls); else update_point(p,x,rs); return; } void update_area(int L,int R,int c,int l,int r,int rt){//区域更新 if(L<=l && r<=R){ add[rt]+=c; mini[rt]+=c; } pushdown(rt); int mid=(l+r)>>1; if(L<=mid)update_area(L,R,c,ls); if(R>mid)update_area(L,R,c,rs); pushup(rt); return; } int query(int L,int R,int l,int r,int rt){//区域查询 if(L<=l && r<=R)return mini[rt]; int mid=(l+r)>>1; int ans=1000000; if(L<=mid)ans=min(ans,query(L,R,ls)); if(mid<R)ans=min(ans,query(L,R,rs)); return ans; } int main(){ }
相关文章推荐
- UIPickerView 的 多重选择
- App接口设计原则-b
- HTML5之FileReader的使用
- HDU 1531 (差分约束)
- Shell中求字符串索引的几种技巧
- CodeForces 518A Vitaly and Strings
- POJ 2823 Sliding Window
- Git配置步骤
- Centos 7防火墙firewalld开放80端口
- 大众点评ETL数据传输平台整体架构
- 配置本地时间服务器(集群)
- Codeforces Round #355 (Div. 2)C. Vanya and Label
- 配置本地时间服务器(集群)
- oracle监听服务无法打开
- Windows 多用户远程访问 Ubuntu 14.04桌面
- mac安装redis
- 外包如何安排人手-b
- 李洪强iOS开发之OC[011] - 有参方法的声明实现以及调用练习
- java文件上传!针对各种文件上传demo实列 文件上传以及数据库保存文件名以及路径名称:
- 自定义ViewPageIndicator