以“遥远的银河”为例浅谈扫描和信息维护的技巧

题目链接:点击打开链接

题目描述:给出平面上n个点,找一个矩形,使得边界上包含尽量多的点。

看到这样一道题,猛一下真的觉得无从下手,上来能够想到的办法就是枚举上下边界,然后再枚举左右边界,然后统计点数。复杂度是O(n5)。显然无法承受。

因此,我们需要一点点仔细的分析,试图将这个问题往以前做过的类似的问题上转化。相似度最高的问题就是“最大连续和问题”,里面用到了一个“前缀和”的技巧。然而这道题好像并不是那么容易就转化到这个简单问题上。因此,我们不妨先思考一下当前遇到的困难是什么。

  1. 需要统计哪些信息?怎么统计?

这毫无疑问是我们当前遇到的最大问题,此时想想刚才的“笨拙”的枚举方法:枚举边界。我们这时可以考虑假设上下边界当前我已经确定了,该怎么做这道题?此时应该有一点模糊的思路了,利用扫描线的思想,统计第i条扫描线左边且在上下边界上的点数(但不包含在第i条线的点),同时还要统计第i条扫描线上有多少点。

然而又发现这样做还不能得到答案,因为点会重复计数,要想办法减去重复的点。此时,一个策略是再开一个数组,表示在第i条扫描线上,但不包含上下边界的点的个数。这样,这个简单一点的问题终于有了比较清晰的思路。

接下来的问题:如何统计?说的更具体一点:

2.需要哪些数组?维数怎么确定?怎么高效地计算它们的值?

我们尝试着按照刚刚找到的思路继续往下走。由于上下边界已经确定了,那么唯一的变量就是扫描线自身了,因此只需要一维数组即可。用Left[i]表示第i条扫描线左侧(不包含第i条扫描线)且在上下边界的点的个数,on2[i]表示第i条线上且在上下边界之间的点的个数,on[i]表示在第i条线上但不包含上下边界的点的个数。这样,假设还知道一个竖线j(j<i),那么ans=Left[i]-Left[j]+on2[i]+on[j]。终于,我们推出了这个问题的第一个公式,算是小有成就。那么如何计算呢?

考虑到坐标范围非常宽,但点的个数比较少,自然想到了“离散化”的思想。显然,x,y都要离散化处理,即把他们都放到一个结构体数组中,用P[i].x,P[i].y表示坐标。但是为了枚举上下边界,我们需要专门把所有的y放到一个数组,命名为y数组。所有的点放到结构体数组中存储,这样就离散化结束了。这样还不够,枚举边界一定是有顺序的——立即想到给y数组排序。会不会有相同的y值?——立即想到还要去重处理。这样,最终的y数组可以保证相邻的两个y值一定不同,枚举上下边界得以实现。

然而我们到现在依然没有实现高效的计算,还要继续探索。接下来就是枚举扫描线了。因为对x也离散化处理了,而扫描线一般是从左往右枚举——想到把所有的点按照x从小到大排序。然而多个不同的点可能都在一条竖线上,如何不重复的枚举扫描线呢?一个策略是寻找充分条件。可以发现,如果i==0或者第i个点的x和前一个不相同,即P[i].x!=P[i-1].x时,就说明遇到了一条新的扫描线,可以增加一个变量k,专门统计已经找到的扫描线条数。

这些工作都处理完后,我们已经知道如何计算on数组和on2数组了——根据表示的含义统计即可。Left数组如何计算?我们发现,Left数组是可以递推的:Left[i]=Left[i-1]+on2[i]-on[i],成功用上了前缀和!其实这要取决于如何设置合适的数组。设置不合理就没有这么简单的事情了。

终于,快接近答案了。因为ans=max(ans,Left[i]-Left[j]+on2[i]+on[j])当i固定时,我们需要让on[j]-Left[j]尽量大。这就转化为“输入一个序列,找两个不同的下标i,j(i<j)使得Ai-Aj尽量大”的经典问题。做法是先更新ans,再更新on[j]-Left[j]。

这样,在两个上下边界确定的情况下,我们成功找到了计算ans的方法。当枚举完所有的上下边界后,最终的ans就是答案。至此,问题获得圆满解决。

之所以写这篇文章,是因为这道题是我见过的利用扫描线解决的比较难的一道题。整个过程需要先进行数学建模,然后才能代码实现。前面的数组的设计和计算都是本题能否解成功解决的关键点。整道题我觉得最值得学习的就是这个建模过程,非常完美的解决了整个问题,并将时间复杂度优化至O(n3),在可承受的范围之内。ACM中,最难的其实不在代码实现,而是在建模过程,本题算是一个非常好的范例。

代码实现:点击打开链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 05:07:37

以“遥远的银河”为例浅谈扫描和信息维护的技巧的相关文章

!! 浅谈Java学习方法和后期面试技巧

浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要的,比如循环系列.For,while,do-while.这方面只要大家用心点基本没什么难点. 二.面向对象:oop面向对象的时候,偏重理论,相信这方面的文章也很多,大家可以多看看,在这就不说了.重点掌握面向对象的三大特征和基本原理. 三.java核心一:这方面主要偏重API,所以在学习了这章的时候,

深圳SEO优化公司浅谈新网站如何快速收录技巧

让新网站如何快速收录的方法教程较为简单,实施较为复杂.简单之处在于做好内容与外链(推荐友情链接),做好基础的url推送以及站内的优化设置即可.复杂在于几句简单的话语,在实施的时候困难不小,新站不易做友链,高质量内容也较难组织.很多站长有会有这样的疑惑,新网站上线了快一个月了咋还没有收录,下面深圳网站推广公司-数商科技小编为大家详细介绍下新站如何快速收录的技巧. 1.百度站长平台链接提交:网站有没有让搜索引擎知道?如果没有~那好,请到百度站长平台里面去提交你的网站链接,接着请继续提交网站的地图(s

浅谈单例的三种实现--C#

传统的double check : public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (i

浅谈无需工作量证明的加密货币

浅谈无需工作量证明的加密货币 Iddo Bentov1,Ariel Gabizon2,Alex Mizrahi (Computer Science Dept., Technion; chromawallet.com) 译者:shylocks ([email protected]) 摘要:本文研究了那些并没有使用 PoW(工作量证明)协议的加密货币.这些协议通常采用 PoS(权益证明)协议,也就是采用了一种使担任验证工作的人获得在系统中相关权限的协议.我们对拥有较多矿工的系统进行了分析.最后,提出

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

浅谈知识管理

工欲善其事,必先利其器 推荐使用为知笔记(WizNote),它是电脑.手机.平板上都能用的云笔记软件,还可以分类管理和共享资料! 使用我的邀请码注册 前言 在做项目,解决某些需求的时候,总会用到自己不熟悉的模块和技术,这时候就会各种谷歌百度查手册,查询完之后,实现功能需求,过一段时间之后,就又忘记当时是如何实现的了. 这时你会怎么做?是又去网上查找一遍?还是说通过之前的个人知识管理,即时抓取.快速检索该知识? 浅谈知识管理(以自己为例) 熟话说:“好记性不如烂笔头”,但是在这个信息爆棚的时代,充

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算