码迷,mamicode.com
首页 > 其他好文 > 详细

存一下线段树模板

时间:2016-07-06 23:16:05      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<map>
 5 #define ls l,mid,rt<<1
 6 #define rs mid+1,r,rt<<1 |1
 7 using namespace std;
 8 const int mxn=100020;
 9 int data[mxn*4];
10 int tre[mxn],mini[mxn];
11 int add[mxn];//懒标记 
12 void pushup(int rt){
13     mini[rt]=min(mini[rt<<1],mini[rt<<1 |1]);
14 }
15 void pushdown(int rt){//向下传递lazy标记 
16     if(add[rt]!=0){
17         add[rt<<1]+=add[rt];
18         add[rt<<1 |1]+=add[rt];
19         mini[rt<<1]+=add[rt];
20         mini[rt<<1 |1]+=add[rt];
21         add[rt]=0;//标记传递完毕,清除 
22     }
23     return;
24 }
25 void Build(int l,int r,int rt){//建树 
26     if(l==r){
27         mini[rt]=data[l];
28         return;
29     }
30     int mid=(l+r)>>1;
31     Build(ls);Build(rs);
32     pushup(rt);
33     return;
34 }
35 void update_point(int p,int x,int l,int r,int rt){//单点更新 
36     if(l==r){
37         mini[rt]=x;
38         return;
39     }
40     int mid=(l+r)>>1;
41     if(p<=mid)update_point(p,x,ls);
42     else update_point(p,x,rs);
43     return;
44 }
45 void update_area(int L,int R,int c,int l,int r,int rt){//区域更新 
46     if(L<=l && r<=R){
47         add[rt]+=c;
48         mini[rt]+=c;
49     }
50     pushdown(rt);
51     int mid=(l+r)>>1;
52     if(L<=mid)update_area(L,R,c,ls);
53     if(R>mid)update_area(L,R,c,rs);
54     pushup(rt);
55     return;
56 }
57 int query(int L,int R,int l,int r,int rt){//区域查询 
58     if(L<=l && r<=R)return mini[rt];
59     int mid=(l+r)>>1;
60     int ans=1000000;
61     if(L<=mid)ans=min(ans,query(L,R,ls));
62     if(mid<R)ans=min(ans,query(L,R,rs));
63     return ans;
64 }
65 int main(){
66     
67     
68     
69 }

 

存一下线段树模板

标签:

原文地址:http://www.cnblogs.com/SilverNebula/p/5648327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!