【zkw线段树讲稿】统计的力量-线段树.pptVIP

【zkw线段树讲稿】统计的力量-线段树.ppt

  1. 1、本文档共102页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【zkw线段树讲稿】统计的力量-线段树

* 清华大学 张昆玮 * 平衡树 splay 可以支持: 区间删除 区间插入 线段树可以支持 区间增加一个数 区间求和 把线段树的值放在平衡树的节点上 * 清华大学 张昆玮 * 每个节点表示它和子树的信息总和 平衡树旋转时更新线段树的域 哇,会动的线段树…… * 清华大学 张昆玮 * 既要区间修改又要区间求和 使用自顶向下的标记下传即可 为了处理区间反转 增设一个bool值表示当前节点左右子树已经互换 先把区间从树中splay出再处理 要同时更改所有节点的反转标记? 不记录反转标记,记录反转标记的标记(!) * 清华大学 张昆玮 * 但是所有部分都是相对简单的! 一点点写,只是很多很多小题而已…… 关于线段树,我们讲的已经太多了…… * 清华大学 张昆玮 * * 清华大学 张昆玮 * K-th number 的另一个方法 如果区间互不包含, 将所有要求的区间排个序来算。 用平衡树或线段树存下当前区间中的数 然后向下一个区间移动 左端点增加是数的删除 右端点增加是数的添加 每个数进出各一次而已 * 清华大学 张昆玮 * 关键在于合理的计算方式 使得相邻区间的差异尽量小 从一个区间变为另一个区间的代价是多少? 把区间看作二维平面的坐标 代价就是两个平面点的Manhattan距离! 然后呢?Hamilton路? 不!一个已知的区间可以用来算很多个未知的! 平面图Manhattan距离最小生成树。 * 清华大学 张昆玮 * 平面图Manhattan距离MST可以在O(nlogn)求出 先对Q个问题用这个方法处理 再按照MST的顺序和方法实际计算 求数学大牛分析总复杂度 虽然绕了很多弯路,但是有一种用模型解决实际问题的感觉。居然MST还能用来做预处理呢…… * 清华大学 张昆玮 * 听了这么久,一起做一道练习题吧…… 给定一列n个数,和m个区间,求每个区间里的众数出现了多少次。 对于10%的数据n100, m100 对于30%的数据n1000,m1000 对于50%的数据n100000,m100000 对于70%的数据n1000000,m1000000 以上数据中区间互不包含。 对于其余30%,n10000,m10000,区间可包含 E-mail:aceeca.135531@ * 清华大学 张昆玮 * * * 清华大学 张昆玮 * 最长上升“区间列” 在一个区间列中按顺序找出最多区间 使得不重叠,单调增 如 [1,3] [2,4] [4,5] 答案是[1,3]+[4,5] 动态规划的可行决策是什么呢? 如果要使上升列长度大于x, 最后一个数最小是多少,记为f[x] 维护f[x]支持点查询和区间修改。 * 清华大学 张昆玮 * 点查询:查询x处f[x]的值 区间修改:x左边的所有超过K的值,变为K 把x的左右换一下……(囧) 整个f[-x]就是单调减的 一个单调减的序列可以看作 是由一个普通序列经过前缀min得到的! 前缀min的逆运算是什么呢? 我们并不关心 * 清华大学 张昆玮 * 我们现在要维护的就是 前缀min的逆运算后的原序列! 可是我们甚至不知道前缀min的逆运算是什么 不要紧,反正用不到。 点查询:查询x处f[x]的值 直接返回维护序列的前缀min 区间修改:x左边的所有超过K的值,变为K 把维护序列中的f[x]变为K * 清华大学 张昆玮 * 不要迷恋哥,哥只是个传说…… * 清华大学 张昆玮 * * 清华大学 张昆玮 * 说了这么多,能使用线段树解决问题的关键: 区间加法,即区间的“性质”由子区间完全决定 包括但不仅限于求和,求最值,求染色状态 这里的“性质”有点像动态规划的状态表示 有时候,求的更多反而更容易 最简单的例子:求区间第二最值 如果实在不满足区间加法,就全完了 * 清华大学 张昆玮 * 我们都知道线段树求区间平均值不难 那求一个区间中位数试试? 什么,还不难? 那你再求个众数? …… * 清华大学 张昆玮 * 越来越难的原因很简单 知道两区间的中位数,就知道和区间的中位数? 知道各自众数有什么用? …… * 清华大学 张昆玮 * 给定一列数,反复求区间第k大数。 要求的更多反而更容易…… 更容易…… 线段树的每个区间必须保留更多的信息! 每个区间中存下区间所有数的有序数组 通过归并完成区间加法 * 清华大学 张昆玮 * 如果每做一次查询就归并若干个线段 复杂度就会达到O(n) 离散化!二分答案! 变为求:x是区间第几大数? 这可以分别二分查找若干线段得到。 总复杂度O(nlogn+Q*log2n) * 清华大学 张昆玮 * 如果有了区间减法…… 线段树就能如虎添翼 如“区间和”变成“前缀和” 操作能简单不少 同时也是能够使用树状数组的条件 但这不是必需的(和区间加法比一比) 我说过后面要讲的嘛

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档