- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
国家集训队2003论文集 陆可昱
长方体的体积并 金陵中学 陆可昱 矩形 平面中n个矩形的面积并的计算 方法: 离散 扫描法 线段树 离散 离散点 矩形各边(或其延长线)与坐标轴的交点 离散单位段 离散点有序化后相邻两个离散点之间的距离 扫描法 把平面分割成条,在每个条中环境变成一维的 每一个给定的条的截面都可表现为其相邻两个条截面中任意一个小的修改 线段树 二叉树 每个结点表示一区间[a,b] b-a1: c=(a+b) div 2 [a,c]及[c,d] 长方体 三维空间中n个长方体的体积并的计算 方法: 离散 扫描法 存储平面 二重二叉树 存储平面 x轴二叉树 y轴二叉树 矩形的示意 标号 根结点为1 非叶子结点i 左子结点:2*i 右子结点:2*i+1 T[x1][y1]表示一个平面区间 x1:x轴二叉树 y1:y轴二叉树 插入及删除 C:记录T[x1][y1]的覆盖次数 最终达到的结点: 水平分量:Ax 垂直分量:Ay p∈Ax,q∈Ay:修改T[p][q].C 面积计算 M:记录T[x1][y1]中矩形的面积并 T[x1][y1].C0 T[x1][y1].C=0 AEIH+EBFI+IFCG+HIGD AEIH AEIH ABFH AEGD 修改面积 遇到的结点的标号: 水平分量:Sx 垂直分量:Sy p∈Sx,q∈Sy:修改T[p][q].M 深度较深的结点 标号大 时间复杂度 修改C:O(lg2n) 修改M: O(lg2n) 总的复杂度:O(n*lg2n) 拓展 方法: 离散 扫描法 存储块 d重二叉树 谢谢 如果将在插入矩形时,所有的在y轴二叉树中遇到的结点的标号用集合Sy存储,所有的在x轴二叉树中遇到的结点的标号用集合Sx存储。 计算一下时间复杂度。 在修改C时,由于Ay与Ax的个数都是(lg n)级的,所以在这一步的复杂度为O(lg2n)。 在修改M时,Sy与Sx的个数也是(lg n)级的,所以在这一步的复杂度也为O(lg2n)。 这样,每添加或删除一个矩形的时间复杂度为O(lg2n)。 在计算长方体体积并的时候,共要进行2n次的添加或删除。 这样解决长方体体积并问题的时间复杂度为O(n*lg2n)。 在解决了三维中的问题后,考虑一下如何解决d维中的问题。 基本的思路还是没有变:离散,分隔,扫描法,存储被分割的块。 同时,在提出的二重二叉树的基础上,也可构造出三重,四重乃至d重二叉树对三维,四维及d维空间进行存储。 当然随着d的不断增大,编程的复杂度也会不断的增大。 * * 大家好,我是南京市金陵中学的学生陆可昱。我这次的题目是求长方体的体积并。 在解决长方体体积并的问题前,先看一下解决矩形面积并时的方法: 先对平面进行离散化,同时将平面分割成条。而后在用扫描法对条进行扫描的同时,利用线段树存储条。从而得解。 下面进行简要的说明。 定义离散点为矩形各边(或其延长线)与坐标轴的交点,如右图的点A,B,C,D; 定义离散单位段为离散点有序化后相邻两个离散点之间的距离,如线段AB,BC,CD 。 在离散之后,可假设图中点A的y轴坐标为1,B为2,C为3,D为4。 如果把平面分割成条,则在每个条中环境变成一维的。 在右图中直线l1(单击鼠标),l2,l3,l4…将平面分成了条。 每一个给定的条(或块)的截面都可表现为其相邻两个条(或块)截面中任意一个小的修改。 图中条二(单击鼠标)的截面则可表现为条一(单击鼠标)的截面加上AB段,或条三(单击鼠标)的截面加上CD段。 线段树是一棵有根二叉树,树中的每一个结点表示了一个区间a,b。对于每个结点,若b与a的差大于1,设c等于a与b的和整除2的商,则此结点将有左子结点a,c,及右子结点c,b。 例如,(单击鼠标)区间1,4,先被分为(单击鼠标)区间1,2,及区间2,4。区间2,4又被分为(单击鼠标)区间2,3及区间3,4。 如同在平面中求n个矩形的面积并一样,求三维空间中n个长方体的体积并的基本思路也是先将空间离散化,而后对被分割的平面进行顺序扫描。不同的是,这次要储存的将是平面,而不是线段。 二重二叉树是一棵用于存储平面的树,它建立于线段树之上。 根据x轴上的区间,应用线段树的构造方式,建立x轴二叉树;同理建造y轴二叉树。 这样即可用x轴二叉树的结点与y轴二叉树的结点,来表示一个二维区间。 对于每个T[x1][y1]都添加一个参数C,用来记录这个区间的被矩形完全覆盖的次数。 在插入或删除一个矩形时, 将水平分量插入x轴二叉树,并用集合Ax存储所有最终达到的结点的标号。 相应的将矩形的垂直分量插入y轴二叉树,并用集合Ay存储所有最终达到的结点的标号。 对于所有的属于Ax的p,以及属于Ay的q,修改T[p][q]的C值 虽然存储二重二叉树的完善的动态形式是可能的,但是为了方便,现采用静态的数组
文档评论(0)