GDSOI2015 task2 覆盖半径
题目大意
一个\(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 覆盖半径的更多相关文章
- task2
1. 邮件修改Mailtemplatereportfieldlink带<>的都改翻译${MAWBTask} 2.测试发邮件 3.找出能做成模版的所有地方,改成模版,复杂的地方记录下来
- 输入框提示--------百度IFE前端task2
第一版本: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- 深度克隆(对象、数组)--------百度IFE前端task2
var srcObj = { a: 1, b: { b1: ["hello", "hi"], b2: "JavaScript" }}; co ...
- GDSOI2015 task4 ACU
题目大意 只要你有耐心看完题目,你就可以得到以下模型: 给出一个有向图,有若干询问,每次询问对于某条边\((v,u)\),求删掉这条边后,\(v\)到\(u\)的最短路. 算法1 暴力出奇迹,期望得分 ...
- 清华集训2014 day1 task2 主旋律
题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...
- 【深度学习】吴恩达网易公开课练习(class2 week1 task2 task3)
正则化 定义:正则化就是在计算损失函数时,在损失函数后添加权重相关的正则项. 作用:减少过拟合现象 正则化有多种,有L1范式,L2范式等.一种常用的正则化公式 \[J_{regularized} = ...
- 【XSY1262】【GDSOI2015】循环排插 斯特林数
题目描述 有一个\(n\)个元素的随机置换\(P\),求\(P\)分解出的轮换个数的\(m\)次方的期望\(\times n!\) \(n\leq 100000,m\leq 30\) 题解 解法一 有 ...
- verilog task2
1.问题:串口的发送和接收 系统时钟50Mhz,波特率119200.系统时钟计数约2604个,才是一位数据的传输时间. 模拟接收的任务函数rx_data_task():LSB first task r ...
- 百度前端技术学院-task2.18-2.19源码以及个人总结
源码:http://yun.baidu.com/share/link?shareid=2310452098&uk=1997604551 1.感觉在写js的时候,最好先理清思路,先干什么,在干什 ...
随机推荐
- java反射机制入门3
Method对象的机制与实现 1.Method对象概述 1)java.lang.reflect.Method类是用于表示类中.接口中方法对象的类. 2)可以操作类中私有,以及公有等全部方法. 2.Me ...
- ACE6.2.0文件/目录操作
文件读取.#include "ace/FILE_Connector.h"#include "ace/FILE_IO.h"void fileRW(){ACE_FI ...
- NSArray的4种遍历方式
前言:NSArray对应的是java的List,不同的是其元素不能更改,不过其派生类NSMutableArray可以更改,遍历的方式跟java的List基本一样 一. for循环 Student * ...
- drawInRect:withAttributes:
- (void)drawRect:(CGRect)frame { NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defa ...
- Visual Studio 2013 Xamarin for iOS 环境搭建
原文:Visual Studio 2013 Xamarin for iOS 环境搭建 一.Mac安装Xamarin.iOS 1,我的Mac 环境:OSX 10.10.3.Xcode 6.3.2 (使用 ...
- 隐藏APK在Launcher中的启动图标 android开发教程
隐藏APK在Launcher中的启动图标: APK的AndroidManifest.xml文件的主Activity中删除 intent-filter 中的 <category android:n ...
- Maven2的配置文件settings.xml(转)
http://maven.apache.org/settings.html简介: 概览当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使 ...
- windows 下一个mysql password忘记改变
到场mysql简介 my.ini 于[mysqld]以下被加入 skip-grant-tables win+R 热键 进cmd 然后输入命令net stop mysql 最后一点,使文件夹mysql ...
- android -- 蓝牙 bluetooth (二) 打开蓝牙
4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...
- Java开源内容管理CMS系统J4CMS的几个样式
www.j4cms.com java 开源内容管理 页面直接编辑 bootstrap3 样式 default 样式 metro 样式 oschina 样式 leblog 样式 foundation 样 ...