【ZJOI 2016】旅行者
题意
题解
大概是神题。
网格图上跑最短路有一个经典的优化方式:分治分组跑最短路。
对于这道题,设矩形长为 \(n\),宽为 \(m\),则对 \(n,m\) 中更大的一个二分。
这里只考虑按 \(n\) 分治的情况。

如上图,设 \(S=nm\),因为此时一列的点数是小等于 \(\sqrt{S}\) 的,所以我们可以枚举红色分割线上的点,以每个点为原点,跑到矩形中所有点的最短路。
然后考虑询问:
如果询问的两点在分割线的不同侧(或者至少有一端在分割线上),则最短路一定经过分割线,用分割线上的每个点到这两个点的最短距离之和更新答案,然后这个询问就不用管了。
如果询问的两点在分割线的同一侧,则最短路可能经过分割线,依然用分割线上的每个点到这两个点的最短距离之和更新答案,然后把这个询问扔到左/右递归区间,去寻找不经过分割线的最短路。
当然,有可能存在分割线上一点 到询问两端的最短路存在部分重合的情况。对于不同侧的情况,画图可知这种情况会被分割线上其它点 用更短路径覆盖掉;对于同一侧的情况,这种情况会被不经过分割线的更短路径覆盖掉。
时间复杂度 \(O(S\sqrt{S}\log^2{S})\)。嗯,码吧……
……
等等,你他吗说什么?这复杂度什么破玩意??跟 \(O(S^2)\) 有啥区别??你让我 \(2s\) 跑带大常数的 \(4e8\)???如果 cpu 是 I9 的说不定真能跑过
其实刚才这个复杂度是凭感觉意淫的,下面就是丧心病狂的算时间复杂度环节了
首先有 \[\begin{align} T(S)&=2T(\frac{S}{2})+O(S\sqrt{S}\log S) \nonumber \\ &= T(S)=2T(\frac{S}{2})+O(S^{1.5}\log S) \nonumber \end{align}\]
然后参考这篇博客的主定理(这里有简单版)
假设我们有递归式 \(T(n)=aT(\frac{n}{b})+f(n)\),我们可以用主定理解这个递归式。
其中 \(n\) 为问题的规模,\(a\) 为递归到下一层的子问题数量,\(\frac{n}{b}\) 为每个子问题的规模,\(f(n)\) 为递推后做的额外计算。
本题中,\(a=b=2\),\(f(S)=O(S^{1.5}\log S)\)。
1. 假设存在常数 \(\epsilon>0\),使得 \(f(n)=O(n^{\log_b(a)-\epsilon})\),则 \(T(n)=\Theta(n^{log_ba})\)
\(\log_b a = \log_2 2 = 1\),则 \(S^{1-\epsilon}=S^{1.5}\log S\),显然 \(\epsilon<0\),故不符合主定理 1。2. 假设存在常数 \(k\ge 0\),使得 \(f(n)=\Theta (n^{\log _{b}a}\log ^{k}n)\),则 \(T(n)=\Theta(n^{log_ba}\log^{k+1}n)\)。
\(S^{\log_b a}\log^k S = S\log^k S = S^{1.5}\log S\)
即要求 \(log^{k-1} S = S^{0.5}\)
参考具体数学第2版 p368 的渐进等级次序,可知 \(\log_x n\lt n^c\),其中 \(x\) 是任意 \(\gt 1\) 的底数,\(c\) 是任意 \(\gt 1\) 的指数,\(<\) 号重定义为函数的渐进增长率关系,即右边的函数更快到达无穷大。
比如有 \(\log n\lt n^{0.0001}\),这可能是很多人都不敢相信的,因为我们通常将视野局限于 \(n\) 不够大的情况,这种情况下 \(\log n\) 的值当然远大于 \(n^{0.0001}\)。比如 \(n=10^{100}\),\(\log n=100\),\(n^{0.0001}≈1.0233\)。但如果我们把 \(n\) 取到 \(10^{10^{100}}\),\(\log n\) 就小于 \(n^{0.0001}\) 了。
那把 \(\log_x n\) 取任意实数次幂,其增长速度是否还小于 \(n^c\) 呢?
确实是的。我们观察渐进增长率关系的定义:\[ f(n)<g(n) \rightleftharpoons \lim_{n \to \infty} \frac{f(n)}{g(n)}=0\]
显然对于任意实数 \(y\),都有 \(\frac{f(n)^y}{g(n)}=0\)。故二者的渐进增长率关系不变。
(这其实算是高数内容了,有点超纲,了解一下就好)
综上,\(log^{k-1} S = S^{0.5}\) 是不可能满足的,随着 \(S\) 的增长,二者的趋向无穷大的速度一定不同,只要 \(S\) 取得足够大,二者的取值就会不同。
故不符合主定理 2。3. 假设存在常数 \(\epsilon >0\),有 \(f(n)=\Omega (n^{\log _{b}(a)+\epsilon })\),同时存在常数 \(c<1\) 以及充分大的 \(n\) 满足 \(af(\frac{n}{b})\le cf(n)\),那么 \(T\left(n\right)=\Theta \left(f\left(n\right)\right)\)。
其实前两个主定理都不符合了,那肯定是用主定理 3 算复杂度了……
本来想验证一下是否满足主定理 3 的,结果主定理 3 的那个 \(\Omega\) 我不会解啊 QvQ,哪位哥哥教教我
于是套用主定理 3,算得 \(T\left(n\right) = \Theta \left(f\left(n\right)\right) = \Theta (S\sqrt{S}\log S)\)。
所以时间复杂度是 \(\Theta (S\sqrt{S}\log S)\)(带不及 \(\log S\) 的小常数)……
这题有一个弱化版,就是强制 \(n\le 10^5\),\(m\le 10\),这时由于递归式里不带 \(\sqrt{S}\),要套主定理 2 而不是主定理 3,所以解出来的时间复杂度是 \(\Theta (mS\log m\log {S})\)。这就是双 \(\log\) 复杂度说法的来源……
【ZJOI 2016】旅行者的更多相关文章
- [BZOJ 4573][ZJOI 2016]大森林
[LOJ 2092][BZOJ 4573][UOJ 195][ZJOI 2016]大森林 题意 给定一个树序列, 初始时所有树都只有一个点, 要求支持三种操作: 区间种树(在某个特定点上长出一个子结点 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- 【BZOJ 4456】【UOJ #184】【ZJOI 2016】旅行者
http://www.lydsy.com/JudgeOnline/problem.php?id=4456 http://uoj.ac/problem/184 参考(抄)的晨爷的题解(代码) 对矩形进行 ...
- 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
http://www.lydsy.com/JudgeOnline/problem.php?id=4455 http://uoj.ac/problem/185 有一个$O(n^n)$的暴力,放宽限制可以 ...
- [ZJOI 2016] 小星星
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 653 Solved: 400[Submit][Status] ...
- Solution -「ZJOI 2016」「洛谷 P3352」线段树
\(\mathcal{Descrtiption}\) 给定 \(\{a_n\}\),现进行 \(m\) 次操作,每次操作随机一个区间 \([l,r]\),令其中元素全部变为区间最大值.对于每个 \ ...
- 【BZOJ4456】旅行者(最短路,分治)
[BZOJ4456]旅行者(最短路,分治) 题面 BZOJ Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北 的道路,这些 ...
- Be Better:遇见更好的自己-2016年记
其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...
- Connect() 2016 大会的主题 ---微软大法好
文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...
随机推荐
- [ES6 系列] 你真的了解ES6吗(一)
前言 无论是我们日常开发还是面试跳坑, ES6 已经变得越来越重要,那么你是否对它足够熟悉呢 ES6 将会是专栏接下来的一个系列,从最基础的概念或者有趣的问题开始逐渐深入,探究 ES6 常用的特性以及 ...
- 鸟哥私房菜基础篇:Linux 账号管理与 ACL 权限配置习题
猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0410accountmanager.php 1-root 的 UID 与 GID 是多少?而基于这个理由 ...
- 利用pycharm 安装tushare(转) + dir(ts)
1.在pycharm里,有安装组件的方法,进入 File - Setting - Project:StockMarket - Project InterPreter,在右边点击“+”,进入搜索页面,搜 ...
- 论文阅读 | Robust Neural Machine Translation with Doubly Adversarial Inputs
(1)用对抗性的源实例攻击翻译模型; (2)使用对抗性目标输入来保护翻译模型,提高其对对抗性源输入的鲁棒性. 生成对抗输入:基于梯度 (平均损失) -> AdvGen 我们的工作处理由白盒N ...
- git 命令 git status add rm commit mv
1.查看 git 仓库文件改动状态 Git 仓库内文件改动有 4 种状态,除了 Unmodified 状态的文件因为并未改动默认没有状态不做显示之外,其他文件改动状态都可以通过 git status ...
- 智能指针分析及auto_ptr源码
简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放 ...
- 11.把文本文件的数据导入到Hive表中
先在hive里面创建一个表 create table mydb2.t3(id int,name string,age int) row format delimited fields terminat ...
- row_number()、rank()、dense_rank()排序方式的区别
1.row_number() 排序策略,连续排序,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,例如1,2,3,4 SELECT names,dept,row_number() OV ...
- Linux就该这么学——新手必须掌握的命令之工作目录切换命令组
pwd命令 用途 : 用于显示用户当前所处的工作目录.如下图pwd命令运行结果所示 格式 : pwd[选项] 图pwd命令运行结果所示 cd命令 用途 : 用于切换工作路径,如图cd命令运行结果 格式 ...
- 3d长方体
html <div class="main"> <div class="a1">1</div> <div class= ...