题目大意

一个\(n\times m\)的矩阵中有\(p\)个已经确定圆心的圆,并且每个格子有一定的分数,如果一个格子被任意一个或以上的圆覆盖,那么就可以得到这个格子的分数。现在求最小的半径,使得得分达到目标得分。

算法1

如果我们从二分答案入手,就可以得到一个判定性问题:给出一些半径相同的圆,求被它们覆盖的格子的分数总和。

如果我们直接统计的话,时间复杂度为\(O(n^2p\log n)\),做足常数优化的话,应该有\(10\)分。

算法2

对上面的进行改良,我们不使用太暴力的方法。我们可以把一个圆拆成若干宽度为\(1\)的矩形,或者说是条形的东西,然后对于每一列,我们可以得到若干区间来覆盖这一列的格子。

这个我们可以对区间的首尾分别进行排序,然后从上往下扫一遍,记一个\(cover\),如果有区间进入就将\(cover\)加一,有出去的区间就减一。接着弄个部分和什么的,就可以得到这一列的得分了。

时间复杂度:还是\(O(n^2p\log n)\)。

算法3

直接用k-d树,期望时间复杂度\(O((n^2\log n + p) \log n)\)。

算法4

换一个思路,计算每个格子被覆盖时最小需要的半径,也就是找到距离这个格子最近的圆心。然后就可以线性的扫描一遍得到答案。

评委给出的方法是,每一次计算一行格子的答案。对于一个在第\(i\)列的格子,计算它到最近的圆心(注意,圆心与这个格子必须在同一列)的距离,记为\(a_i\),显然这个是很容易计算的。然后对于位于第\(i\)列的格子,我们可以枚举\(j\),这时,这个格子的答案可以这样计算:\(\min_j {((i-j)^2+a_j)}\)即\(\min_j (i^2+j^2-2ij+a_j)\)。

设一个截距\(z= i^2+j^2-2ij+a_j\),然后就是\(2ij+z= i^2+j^2+a_j\),把\(2j\)当作横坐标,\(j^2+a_j\)为纵坐标,就是典型的斜率优化。这里\(i\)递增,\(2j\)递增,所以这个可以在\(O(n)\)的时间内完成。

于是我们可以从左往右做一次,再从右往左做一次,就可以得到这一行的格子的答案了。

总时间复杂度\(O(n^2)\)。

算法5

这是评讲时各路神犇提出的方法,同样要计算距离每个格子最近的圆心:

对于每一个格子,记一个二元组\((d,k)\),表示距离这个格子最近的圆心是为\(k\),距离是\(d\)。于是,每个格子可以去更新其他格子。注意到\(d\)最小的格子是不可能被其他格子更新的,所以我们可以采用Dijkstra的思想,弄一个优先队列不断更新即可。

时间复杂度:\(O(n^2\log n)\)。

算法6

还是k-d树,期望时间复杂度\(O(n^2\log n)\)。

算法7

维护一个凸壳,然后通过三分来找到最近的点。需要上下各做一次。

时间复杂度:\(O(n^2 \log_{1.5} n)\)。

算法8

这是zhx提出的随机化算法,考场上A掉了数据。

先把塔random_shuffle一下,每次取一座塔,然后往四周宽搜更新格子最近的塔,当然,如果不能更新则不把该格子放入队列。据zhx所言,每个点期望被更新\(log n\)次,我也不知道怎么证明啊囧。所以总的时间复杂度是\(O(n^2 \log n)\),感觉会很好写。

GDSOI2015 task2 覆盖半径的更多相关文章

  1. task2

    1. 邮件修改Mailtemplatereportfieldlink带<>的都改翻译${MAWBTask} 2.测试发邮件 3.找出能做成模版的所有地方,改成模版,复杂的地方记录下来

  2. 输入框提示--------百度IFE前端task2

    第一版本: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  3. 深度克隆(对象、数组)--------百度IFE前端task2

    var srcObj = { a: 1, b: { b1: ["hello", "hi"], b2: "JavaScript" }}; co ...

  4. GDSOI2015 task4 ACU

    题目大意 只要你有耐心看完题目,你就可以得到以下模型: 给出一个有向图,有若干询问,每次询问对于某条边\((v,u)\),求删掉这条边后,\(v\)到\(u\)的最短路. 算法1 暴力出奇迹,期望得分 ...

  5. 清华集训2014 day1 task2 主旋律

    题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...

  6. 【深度学习】吴恩达网易公开课练习(class2 week1 task2 task3)

    正则化 定义:正则化就是在计算损失函数时,在损失函数后添加权重相关的正则项. 作用:减少过拟合现象 正则化有多种,有L1范式,L2范式等.一种常用的正则化公式 \[J_{regularized} = ...

  7. 【XSY1262】【GDSOI2015】循环排插 斯特林数

    题目描述 有一个\(n\)个元素的随机置换\(P\),求\(P\)分解出的轮换个数的\(m\)次方的期望\(\times n!\) \(n\leq 100000,m\leq 30\) 题解 解法一 有 ...

  8. verilog task2

    1.问题:串口的发送和接收 系统时钟50Mhz,波特率119200.系统时钟计数约2604个,才是一位数据的传输时间. 模拟接收的任务函数rx_data_task():LSB first task r ...

  9. 百度前端技术学院-task2.18-2.19源码以及个人总结

    源码:http://yun.baidu.com/share/link?shareid=2310452098&uk=1997604551 1.感觉在写js的时候,最好先理清思路,先干什么,在干什 ...

随机推荐

  1. struct 如何存储指针类型的值

    通过 __unsafe_unretained标示符标示指针类型的值,否则xcode会报以下错误(前提,你使用的是ARC模式): ARC forbids Objective-C objects in s ...

  2. Oracle数据库的启动和关闭实例

    在开始了解oracle数据库的命令之前,先来看一个东西:SQL*PLUS(sqlplus) Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*p ...

  3. Myeclipse代码提示及如何设置自动提示

    Myeclipse代码提示及如何设置自动提示 (2011-11-18 00:38:41) 转载▼ 标签: 杂谈 分类: Java 1. 设置代码自动提示window --> preference ...

  4. sqm(sqlmapGUI) pcat修改版

    sqlmap是一款开源的注入工具,支持几乎所有的数据库,支持get/post/cookie注入,支持错误回显注入/盲注,还有其他多种注入方法. 支持代理,指纹识别技术判断数据库 .而sqm(sqlma ...

  5. WPF DataGrid模拟click实现效果

    WPF的DataGrid原生是不支持Click事件的,然而在开发过程中,经常遇到需要实现类似效果的. 举个栗子:表格第一列是一个CheckBox,需要实现功能点击行选中,再点击取消选中. 第一想法是R ...

  6. openstack 入门1

    介绍 Rackspace & NASA软件开源项目的组合安装配置复杂基础设施资源的系统管理平台 (网络,计算,存储)个人打井 vs 自来水厂 组件&原理 Horizon -- UI模块 ...

  7. 405 HTTP method GET is not supported by this URL

    孙鑫java web开发详解P285里面提交Get网站弹出提示405 HTTP method GET is not supported by this URL 原因父类doGet()方法未覆盖. 应写 ...

  8. 命名空间“System.Web.Mvc”中不存在类型或命名空间“Ajax”(是否缺少程序集引用?)

    原文  http://www.cnblogs.com/LJP-JumpAndFly/p/4109602.html 好吧,非常激动的说,这个问题搞了我一个晚上,网上的帖子太少了,好像不超过2篇,而且说得 ...

  9. 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)

    序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...

  10. github的.md格式文件

    md文件是github改良了markdown的语法,用来显示在项目首页的文件.在官方的网址说的很清楚: GitHub uses what we're calling "GitHub Flav ...