HH神总结的线段树专辑_超经典的.pdf

HH神总结的线段树专辑_超经典的.pdf

ID:52429472

大小:249.23 KB

页数:21页

时间:2020-03-27

HH神总结的线段树专辑_超经典的.pdf_第1页
HH神总结的线段树专辑_超经典的.pdf_第2页
HH神总结的线段树专辑_超经典的.pdf_第3页
HH神总结的线段树专辑_超经典的.pdf_第4页
HH神总结的线段树专辑_超经典的.pdf_第5页
资源描述:

《HH神总结的线段树专辑_超经典的.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~;并且学习了splay等更高级的数据结构后对线段树的体会有更深了一层,线段树的写法也就比以前飘逸,简洁且方便多了.在代码前先介绍

2、一些我的线段树风格:maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很方便PushUP(intrt)是把当前结点的信息更新到父结点PushDown(intrt)是把当前结点的信息更新给儿子

3、结点rt表示当前子树的根(root),也就是当前所在的结点整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分:单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(intr)这个函数更新上来ohdu1166敌兵布阵题意:O(-1)思路:O(-1)线段树功能:update:单点增减query:区间求和?ViewCodeCPP1#include23#definelsonl,m,rt<<14#definersonm+1,r,rt<<1

4、15constintmaxn=55555;6i

5、ntsum[maxn<<2];7voidPushUP(intrt){8sum[rt]=sum[rt<<1]+sum[rt<<1

6、1];9}10voidbuild(intl,intr,intrt){11if(l==r){12scanf("%d",&sum[rt]);13return;14}15intm=(l+r)>>1;16build(lson);17build(rson);18PushUP(rt);19}20voidupdate(intp,intadd,intl,intr,intrt){21if(l==r){22sum

7、[rt]+=add;23return;24}25intm=(l+r)>>1;26if(p<=m)update(p,add,lson);27elseupdate(p,add,rson);28PushUP(rt);29}30intquery(intL,intR,intl,intr,intrt){31if(L<=l&&r<=R){32returnsum[rt];33}34intm=(l+r)>>1;35intret=0;36if(L<=m)ret+=query(L,R,lson);37if(R>m)ret+=query(L,

8、R,rson);38returnret;39}40intmain(){41intT,n;42scanf("%d",&T);43for(intcas=1;cas<=T;cas++){44printf("Case%d:",cas);45scanf("%d",&n);46build(1,n,1);47charop[10];48while(scanf("%s",op)){49if(op[0]=='E')break;50inta,b;51scanf("%d%d",&a,&b);52if(op[0]=='Q')printf("

9、%d",query(a,b,1,n,531));54elseif(op[0]=='S')update(a,-b,1,n,1);55elseupdate(a,b,1,n,1);56}57}58return0;}ohdu1754IHateIt题意:O(-1)思路:O(-1)线段树功能:update:单点替换query:区间最值?ViewCodeCPP1#include2#include3usingnamespacestd;45#definelsonl,m,rt<<16#define

10、rsonm+1,r,rt<<1

11、17constintmaxn=222222;8intMAX[maxn<<2];9voidPushUP(intrt){10MAX[rt]=max(MAX[rt<<1],MAX[rt<<1

12、1]);11}12voidbuild(intl,intr,intrt){13if(l==r){14scanf("%

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。