国家集训队论文集林涛.ppt

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

线段树的应用 广西柳铁一中 林涛 线段树的定义 线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。 线段树T(a,b)也可递归定义为: 若L1 : [a, (a+b) div 2]为 T的左儿子; [(a+b) div 2,b]为T 的右儿子。 若L=1 : T为叶子节点。 线段树的特征 定理二:线段树把区间上的任意一条线段都分成不超过2logL条线段。 线段树的基本操作 插入一条线段:每个节点增加一个变量记录该节点被插入所有线段覆盖的次数,自根节点往下,直到一个被线段完全覆盖的节点。 例1:蛇(SGU 128) 在平面上有N个点,现在要用一些线段将它们连起来,使其满足以下要求: 1 这些线段必须闭合 2 线段的端点只能是这N个点。 3 交于一点的两条线段成90度角 4 线段都必须平行于X轴或Y轴 5 所有线段除了在这N个点外不相交 6 所有线段的长度之和必须最短 如果存在这样的线段,则输出最小长度,否则输出0。 【问题分析】 所求的图形是以题目所给的N个点为顶点的多边形。每条边要和X轴或Y轴平行。每个顶点与一条平行于X轴和一条平行于Y轴的线段相连。 如图,两条线段在内部相交,则必须满足x1xx2 和 y1yy2。 【问题解法】 将所有线段按X轴坐标排序,每条平行于Y轴的线段和每个平行于X轴线段的端点称为一个事件 将Y轴代表的区间建成线段树,并且每个节点记录它的区间内插入的点数。按顺序,扫描所有事件:如果遇到平行于X轴线段的左端点,则插入到线段树中,遇到右端点,则从线段树中删除 。如果遇到平行于Y轴的线段,则在线段树中查找。 例2:空心长方体(POI99 Cuboid) 在一个三维正坐标系中,存在N(N=5000)个点,现在要求一点P(x,y,z),使得O(0,0,0)与P(x,y,z)两个顶点构成的长方体内不包括N个点中的任何一个点(在长方体边缘不算包括),并使这个长方体的体积最大。x,y,z均不得超过1000000。 【问题分析】 P(x,y,z)代表的长方体包含一点Q,那么P的所有坐标值,都大于Q点的坐标值。 PxQx PyQy PzQz 【问题分析】 在已经确定P的X坐标情况下,将所有点的y坐标排序,得到序列y[1],y[2],y[3]……。max[i]记录P的Y轴坐标为y[i]时,Z轴坐标的最大取值,数组max的值是单调不增的。 【问题分析】 考虑第i个点Q(x,y,z)增加对数组的限制 【问题解法】 建立关于数组max的线段树,每增加一个节点的限制,就相当于修改线段树中的一个区间内的值 【问题解法】 线段树中,每个节点要记录其表示的区间内max[i]*y[i]的最大值,并且在数组被修改时,维护这个最大值。根节点的最大值与P点当前X坐标相乘,就是当前最大体积。 总结这题的成功之处:不把线段树死板的按看成固定的,而是抓住线段树叶子节点的本质——区间内的各种数据是单一,根据情况把子树收缩为叶子或让叶子释放出儿子,从而避免重复的操作。 例3:战场统计系统 【问题描述】 【问题分析】 把两类信息抽象化:T[x,y]表示单位区间[x,x]上防御力为y的部队数目,如果在[x1,x2]增加防御力为v的部队,就是在这个二维数组内,添加一个[x1, x2][1,v]的矩形;要使用一次武器就相当于查找一个矩形[x1, x2] [1,v]内的部队数目,并将此矩形内的所有部队删除。 【问题分析】 首先可以考虑在一维上优化,在每个单位区间[x,x]上,分别用一棵线段树记录各种防御力的部队数。 【问题解法】 优化后每次删除、统计、插入的复杂度都是O(n*logv),所以总的复杂度降为O(m*n*logv); 【问题分析 】 由于这是个二维的区间,不妨将整个二维的区间建成类似线段树的面积树: 假设整个二维区间是[1..2k][1..2k],递归定义一棵树T: 1 T的根节点为整个二维区间。 2 区间[x,x][y,y]为叶子节点 3 儿子的划分: 建立面积树后,任意一个矩形在树中,都被划分为不超过O(2k)块区域,仿造线段树的方法进行插入、查找、和删除,就可以把本题复杂度降为O(m*(n+v)) 总结用线段树解题的方法 根据题目要求将一个区间建成线段树,一般的题目都需要对坐标离散。建树时,不要拘泥于线段树这个名字而只将线段建树,只要是表示区间,而且区间是由单位元素(可以是一个点、线段、或数组中一个值)组成的,都可以建线段树;不要拘泥于一维,根据题目要求可以建立面积树、体积树等等。 树的每个节点根据题目所需,设置变量记录要求的值。 在非规则删除操作和大规模修改数据操作中,要灵活的运用子树的收

文档评论(0)

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

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

1亿VIP精品文档

相关文档