博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树模板
阅读量:6993 次
发布时间:2019-06-27

本文共 4678 字,大约阅读时间需要 15 分钟。

线段树就像一句话:

听过很多道理,却依然过不好这一生。 ε(┬┬﹏┬┬)3

 

还是总结一下线段树的知识点。网上有很多模板,其中最突出的就不用说了,《线段树完全版》主要是没怎么学,没怎么去了解那个大佬的风格。

这里我记录一下刘汝佳大牛的板子。

 

#include 
using namespace std;const int maxnode = 1<<17;// maxnode = 2<

 

 

#include 
using namespace std;//区间修改// add(l,r,v)const int maxnode = 1<<17;// maxnode = 2<
L) { sumv[o] = sumv[lc] + sumv[rc]; minv[o] = min(minv[lc],minv[rc]); maxv[o] = max(maxv[lc],maxv[rc]); } minv[o] +=addv[o]; maxv[o] +=addv[o]; sumv[o] +=addv[o]*(R-L+1); } void update(int o,int L,int R) { int lc = o*2,rc = o*2+1; if(ql<=L&&qr>=R) addv[o]+=v; else { int M = L + (R-L)/2; if(ql<=M) update(lc,L,M); if(qr>M) update(rc,M+1,R); } maintain(o,L,R); } void query(int o,int L,int R,int add) { if(ql<=L&&qr>=R) { _sum +=sumv[o] + add*(R-L+1); _min = min(_min,minv[o]+add); _max = max(_max,maxv[o]+add); } else { int M = L + (R-L)/2; if(ql<=M) query(o*2,L,M,add+addv[o]); if(qr>M) query(o*2+1,M+1,add+addv[o]); } } };IntervalTree tree;int main(){ int n,m,op; while(scanf("%d%d",&n,&m)==2) { memset(&tree,0,sizeof(tree)); scanf("%d%d%d",&op,&ql,&qr); if(op==1) { scanf("%d",&v); tree.update(1,1,n); } else { _sum = 0;_min=INF;_max = -INF; tree.query(1,1,n,0); printf("%d %d %d\n",_sum,_min,_max); } } return 0;}

 

 

 

#include 
using namespace std;const int maxnode = 1<<17;// maxnode = 2<
L) { sumv[o] = sumv[lc] + sumv[rc]; minv[o] = min(minv[lc],minv[rc]); maxv[o] = max(maxv[lc],maxv[rc]); } if(setv[o]>=0) { minv[o] = maxv[o] = setv[o]; sumv[o] = setv[o]*(R-L+1); } } //标记传递 void pushdown(int o) { int lc = o*2,rc = o*2 + 1; if(setv[o]>=0) { setv[lc] = setv[rc] = setv[o]; setv[o] = -1; } } void update(int o,int L,int R) { int lc = o*2,rc = o*2+1; if(ql<=L&&qr>=R) { setv[o] = v; } else { pushdown(o); int M = L + (R-L)/2; if(ql<=M) { update(lc,L,M); } else maintain(lc,L,M); if(qr>M) { update(rc,M+1,R); } else maintain(rc,M+1,R); } maintain(o,L,R); } void query(int o,int L,int R) { if(setv[o]>=o) { _sum +=setv[o]*(min(R,qr)-max(L,ql)+1); _min = min(_min,setv[o]); _max = max(_max,setv[o]); } else if(ql<=L&&qr>=R) { _sum +=sumv[o]; _min = min(_min,minv[o]); _max = max(_max,maxv[o]); } else { int M = L + (R-L)/2; if(ql<=M) query(o*2,L,M); if(qr>M) query(o*2+1,M+1,R); } } };IntervalTree tree;int main(){ int n,m,op; while(scanf("%d%d",&n,&m)==2) { memset(&tree,0,sizeof(tree)); memset(tree.setv,-1,sizeof(tree.setv)); tree.setv[1] = 0; while(m--) { scanf("%d%d%d",&op,&ql,&qr); if(op==1) { scanf("%d",&v); tree.update(1,1,n); } else { _sum = 0,_min = INF;_max = -INF; tree.query(1,1,n); printf("%d %d %d\n",_sum,_min,_max); } } } return 0;}

 

未完。。。

 

之前一直对刘汝佳的线段树信心不大。是因为刘汝佳的板子没有build操作,以至于初始化的时候,是O(nlogn),现在重新复习一下线段树,找到了含有build操作的板子。

这下线段树的基本操作就已经差不多了!!!

#include 
using namespace std;const int INF = 1000000000;const int maxnode = 1<<18;const int maxn = 100000+10;int A[maxn];int op,qL,qR,p,v; //单点更新,建树操作,A[p] = v;struct IntervalTree { int minv[maxnode]; void build(int o,int L,int R) { int M = L + (R-L)/2; if(L==R) minv[o] = A[L]; else { build(o*2,L,M); build(o*2+1,M+1,R); minv[o] = min(minv[o*2],minv[o*2+1]); } } void update(int o,int L,int R) { int M = L + (R-L)/2; if(L==R) minv[o] = v; else { if(p<=M) update(o*2,L,M); else update(o*2+1,M+1,R); minv[o] = min(minv[o*2],minv[o*2+1]); } } int query(int o,int L,int R) { int M = L + (R-L)/2,ans = INF; if(qL<=L&&R<=qR) return minv[o]; if(qL<=M) ans = min(ans,query(o*2,L,M)); if(M

 

转载于:https://www.cnblogs.com/TreeDream/p/6696569.html

你可能感兴趣的文章
Javascript事件总结
查看>>
(原创)speex与wav格式音频文件的互相转换(二)
查看>>
C#中模拟用户登陆SharePoint网站
查看>>
用css3实现各种图标效果(1)
查看>>
Bind("入库日期", "{0:yyyy-MM-dd}") 关于asp.net格式化数据库日期字符串
查看>>
TortoiseSvn客户端出现Http state 405 'Method Not Allowed' 的解决办法
查看>>
layoutSubviews总结
查看>>
目标检测的图像特征提取(一)HOG特点
查看>>
百度地图 Android SDK - 新的版本号(v3.2.0)正式上线
查看>>
TF-IDF模型的概率解释
查看>>
Android之桌面组件AppWidget
查看>>
使用ab进行页面的压力测试
查看>>
桌面轻量级数据库的选择:Access、SQLite、自己编写?
查看>>
Linux运维不可不知的性能监控和调试工具
查看>>
2015UESTC 暑假集训总结
查看>>
jQuery Post
查看>>
WebApiThrottle限流框架使用手册
查看>>
SQL Server里的自旋锁介绍
查看>>
成为高级程序员的 10 个步骤
查看>>
关于map与set的一点理解;
查看>>