算法竞赛第三章数据结构基础.ppt

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

线段树的应用 1、hdu 1166 敌兵布阵 /problem/HDU-1166 线段树单点更新模板题,直接使用以上代码搞定 单点增减,区间求和 线段树的应用 2、hdu 1754 I Hate It /problem/HDU-1754 线段树单点更新模板题,直接使用以上代码搞定 单点替换,区间最值 每次更新的时候在区间结点存储此区间的最大值,查询的时候就不需要每次都查到最下面 更新时间复杂度O(logN),询问时间复杂度O(logN) 线段树的应用 3、洛谷 P3372 【模板】线段树 1 /problem/show?pid=3372 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 线段树的应用 70分+TLE 将区间更新转换为单点更新 对于区间更新,如果我们每次都更新到底的话,复杂度为N*logN,Q次操作,则总时间为Q*N*logN,这很容易超时。 100分+lazy 加入延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。 Lazy-tag思想 在此通俗的解释我理解的Lazy意思: 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,它的节点标记为rt,这时tree[rt].l== a tree[rt].r==b这时我们可以一步更新此时rt节点的sum[rt]的值,sum[rt]+=c*(tree[rt].r-tree[rt] .l+1),注意关键的时刻来了,如果此时按照常规的线段树的update操作,这时候还应该更新rt子节点的sum[]值,而Lazy思想恰恰是暂时不更新rt子节点的sum[]值,到此就return,直到下次需要用到rt子节点的值的时候才去更新,这样避免许多可能无用的操作,从而节省时间 。 举例 已知数组[1,5,4,1,6]; 操作1、对区间[1,3]每个数增加2 问题1、查询区间[1,2]的和 问题2、查询区间[3,4]的和 lazy=0 sum=5 lazy=0 sum=4 lazy=0 sum=6 lazy=0 sum=1 lazy=0 sum=1 lazy=0 sum=6 lazy=0 sum=10 lazy=0 sum=7 lazy=0 sum=17 [1,5] [1,3] [1,2] [3,3] [4,5] [5,5] [4,4] [2,2] [1,1] 已知数组[1,5,4,1,6]; lazy=2 sum=16 lazy=2 sum=10 lazy=0 sum=3 lazy=0 sum=7 lazy=0 sum=6 lazy=0 sum=23 向下延时更新(Pushdown) 建立线段树[l,r],并进行lazy标记 将区间[a,b]每个数加上x 查询区间[a,b]的和 1082 线段树练习 3 /problem/1082/ 线段树模板题 区间更新,区间查询 线段树的应用 4、poj 3468 A Simple Problem with Integers /problem/POJ-3468 题意:一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和。 模板题,直接看代码吧 线段树的应用 思考题、洛谷 P3373 【模板】线段树 2 /problem/show?pid=3373 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 线段树的常见操作 1、建立线段树(即初始化Build) 2、更新操作(Update) 3、查询操作(Query) 4、向上回溯(Pushup) 5、向下延时更新(Pushdown) 基本要求:单点替换、单点增减、区间求和、区间最值、区间替换、区间增减 线段树题目大致可以分为四大类: 1、单点更新:最最基础的线段树,只更新叶子节点,然后回溯更新其父亲结点。 2、区间更新:(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。 3、区间合并:这类题目会询问区间满足条件的连续最长区间,所以回溯的时候需要对左右儿子的区间进行合并。 4、扫描线:这类题目需要将一些操作排序,然后从左到右用一根扫描线(当然是在我们脑子里)扫过去。最典型的就是矩形面积并,周长并等问题。 线段树 线段树学习必看的blog /Mu-Tou/archive/2011/08/11/2134427.html /articles/jaUVBv 数据结构 Keywor

文档评论(0)

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

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

1亿VIP精品文档

相关文档