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

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HH神总结的线段树专辑_超经典的

【完全版】线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还 去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了, 很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格, 实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把 近年我接触到的一些新题更新上去~;并且学习了splay等更高级的数据结构后对线段树的体会有 更深了一层,线段树的写法也就比以前飘逸,简洁且方便多了. 在代码前先介绍一些我的线段树风格:  maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开 于maxn的最小 2 的两倍x  lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变 量,所以可以用预定于比较方便的表示  以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一 边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很 方便  PushUP(intrt)是把当前结点的信息更新到父结点  PushDown(intrt)是把当前结点的信息更新给儿子结点  rt表示当前子树的根(root),也就是当前所在的结点 整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分:  单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(intr)这个函数更新 上来 o hdu1166 敌兵布阵 题意:O(-1) 思路:O(-1) 线段树功能:update:单点增减 query:区间求和 ?View CodeCPP 1 #include cstdio 2 3 #define lsonl, m, rt1 4 #define rsonm+1,r, rt1|1 5 const int maxn = 55555; 6 int summaxn[ 2]; 7 void (int ) { PushUP rt 8 [ ] = [ 1] + [ 1|1]; sumrt sumrt sumrt 9 } 10 void (int int int ) { build l, r, rt 11 if ( == ) { l r 12 scanf(%d [ ]); , sumrt 13 return ; 14 } 15 int = ( + ) 1; m l r 16 build lson( ); 17 build rson( ); 18 ( ); PushUPrt 19 } 20 void (int int int int int ) { update p, add, l, r, rt 21 if ( == ) { l r 22 [ ] += ; sumrt

文档评论(0)

xxj1658888 + 关注
实名认证
内容提供者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档