zoukankan      html  css  js  c++  java
  • 线段树好题(2004集训队林涛PPT中的3题)

    1、snake:主要是要意识到全局的可能连法只有一种= =(略坑,题目的最小长度是唬人的……),所以关键就是能否构造出符合题意的图,可以考虑搜索解决,搜出一个就OK了,但是会发现那些满足条件中线段在非端点处不自交不好判断,这里用线段树解决,按扫描线扫,横着的线段就插入,竖着的线段就看它所在的横坐标是否被线段树中某条横着的线段覆盖了,如果覆盖了就无解,http://blog.sina.com.cn/s/blog_51cea4040100gf9l.html

    2、Cuboid:

      先来看最简单的二维的:

        在一个封闭矩形平面上有n个点,在这个封闭平面上找一个点,使得以这个点和矩形平面左下角(原点)为对角顶点而形成的子矩形中不包含给定的任何一个点(在边上不算),且使得子矩形面积最大。

        分析问题:1、设n个点的x坐标的集合为X,y坐标的集合为Y,你选择的点P(m,n),则m∈X,n∈Y。这个很好理解,也就是说如果当前你找到的点构成的矩形        的两条边没有经过任何一个点,那么这一定不是最优的,因为可以向上扩展△y,向右扩展△x使得面积更大

             2、由1可以很快想到一个n^3的算法,就是枚举横纵坐标并判定

             3、2中的复杂度无法接受,从以前的经验我们可以马上想到这种题觉得可以用扫描线做:

                ①先把点排序(第一关键字:x从小到大 第二关键字 y从小到大)

                ②我们从x的从小到大一个个看,假设当前x0是我们要找找的P点的横坐标,则现在我们想要的是要在X=x0这条直线上找一个最高的点使得能够满足题设要求,很容易发现这个最高的点就是从左到右扫到现在的所有点中纵坐标的最小,我们不妨max(i)表示x=i时,y的最大值。易得这个扫描是O(n)的

             4、ans=max{i*max(i)} i∈X

      那么其实此题就是二维在三维上的推广,三维当然从扫描线变到扫描面了啦

            1、易得此问题要求的点仍满足二维中的第一点

            2、不妨枚举X坐标,那么接下来要解决的问题又是我们最擅长的平面问题了

            3、对于确定X坐标所在的平面,我们可以还按照二维的方法做O(n)的,那么总的复杂度为n^2

      想一想有更优的做法吗!!!?

      其实如果我们只是枚举了一维坐标,其他都按照二维的一模一样做,那么怎么能叫推广呢?????

      现在仔细想想我们是如何把二维问题降到O(n)的?————那是因为每一列扫描线中间都有他们间的关系,即max(i)=min(max(i-1),当前扫描线所在列上的输入的点的最小纵坐标),所以我们可以O(1)实现状态转移

      而我们要推广的实质就是这个性质!下面回到三维中重新考虑下,我们有必要每次都要对新的平面重新做吗?

      没必要!我们可以完成X=i -> i+1的快速转移,即用线段树。这个论文讲的十分清楚了这里就不说了。

      总结:主要的就是以后碰见三维的题目而且不好下手的不妨从二维先入手,一般都能推广到三维,但“推广”并不是数学中的“降维”那样注定你的时间复杂度是不可接受的,推广的其实是二维的一些性质和决策转移,而一般转移都需要用到数据结构。

      PS:论文中提到的线段树收缩和释放的实质应该就是Lazy标记……各位神犇不用太过纠结……

    3、战场统计系统:这个就是水水的二维线段树(一般用矩形树写),没什么东西,注意一点矩形树的数组一般开1.5*m*n就行了

        

  • 相关阅读:
    RabbitMQ第一次不能正常读取第二次正常的问题
    ng跳转映射,被阿里云的云盾拦截,提示备案问题分析
    Java读取excel表,getPhysicalNumberOfCells()和getLastCellNum区别
    IDEA同步上传lua代码,方便开发。
    redis安装
    面试感悟----一名3年工作经验的程序员应该具备的技能
    SQL Server的case when用法
    SQL Server常用函数使用方法(学习)
    Openresty编写Lua代码一例
    Nginx的配置文件nginx.conf解析
  • 原文地址:https://www.cnblogs.com/wmrv587/p/3556823.html
Copyright © 2011-2022 走看看