题意

  http://uoj.ac/problem/184

题解

  大概是神题。

  网格图上跑最短路有一个经典的优化方式:分治分组跑最短路。
  对于这道题,设矩形长为 \(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\) 复杂度说法的来源……

  code

【ZJOI 2016】旅行者的更多相关文章

  1. [BZOJ 4573][ZJOI 2016]大森林

    [LOJ 2092][BZOJ 4573][UOJ 195][ZJOI 2016]大森林 题意 给定一个树序列, 初始时所有树都只有一个点, 要求支持三种操作: 区间种树(在某个特定点上长出一个子结点 ...

  2. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  3. 【BZOJ 4456】【UOJ #184】【ZJOI 2016】旅行者

    http://www.lydsy.com/JudgeOnline/problem.php?id=4456 http://uoj.ac/problem/184 参考(抄)的晨爷的题解(代码) 对矩形进行 ...

  4. 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星

    http://www.lydsy.com/JudgeOnline/problem.php?id=4455 http://uoj.ac/problem/185 有一个$O(n^n)$的暴力,放宽限制可以 ...

  5. [ZJOI 2016] 小星星

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 653  Solved: 400[Submit][Status] ...

  6. Solution -「ZJOI 2016」「洛谷 P3352」线段树

    \(\mathcal{Descrtiption}\)   给定 \(\{a_n\}\),现进行 \(m\) 次操作,每次操作随机一个区间 \([l,r]\),令其中元素全部变为区间最大值.对于每个 \ ...

  7. 【BZOJ4456】旅行者(最短路,分治)

    [BZOJ4456]旅行者(最短路,分治) 题面 BZOJ Description 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北 的道路,这些 ...

  8. Be Better:遇见更好的自己-2016年记

    其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...

  9. Connect() 2016 大会的主题 ---微软大法好

    文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...

随机推荐

  1. C语言递归之翻转二叉树

    题目描述 翻转一棵二叉树. 示例 输入: / \ / \ / \ 输出: / \ / \ / \ 题目要求 /** * Definition for a binary tree node. * str ...

  2. python 之魔法方法

    描述符就是将某种特殊类型的类的实例指派给另一个类的属性 例如下面的示例 class MyDecriptor(): def get(self,instance,owner): print("g ...

  3. windows下,给golang编译的exe添加一个图标

    通过go build生成的exe文件,通常是一个默认的图标,发给别人的时候,总觉得像病毒,下面我们来给他加一个好看的图标,让他看起来正经一些. 1.找到一个喜欢的图片. 2.通过工具或是在线工具生成. ...

  4. 【转帖】K8s-yaml的使用及命令

    K8s-yaml的使用及命令 https://www.cnblogs.com/fuyuteng/p/9460534.html YAML配置文件管理对象 对象管理: # 创建deployment资源 k ...

  5. MySQL优化——索引

    内容来自:https://yq.aliyun.com/articles/214494?utm_content=m_31338 对此我们来详细分析下(也就是大家在面试时需要说的): 场景一,数据表规模不 ...

  6. Oracle 中 decode 函数用法(字段A,B, C,A不为空则取A,否则取B,B为空则取C)

    –decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值) SELECT DECODE(TEMP.SCORE, ‘A’, ‘90-100’, ‘B’, ‘80-89’, ‘C’, ...

  7. 终于有人把“TCC分布式事务”实现原理讲明白了

    所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 首先说一下,这里可能会牵扯到一些 Spring Cloud 的原理,如果有不太清楚的同 ...

  8. Resistors in Parallel(找规律+大数)

    题意:https://codeforces.com/group/ikIh7rsWAl/contest/254825/problem/E 给你一个n,计算n / Sigma(1~n)的d(是n的只出现一 ...

  9. stalstack

    Saltstack 是干什么的 saltstack 是一个开源异构平台基础设置管理工具 Saltstack 能干什么 如果是一个管理成千上百服务器的管理员,你会遇到场景 需要在每台服务器上面部署age ...

  10. 如何利用python爬虫爬取爱奇艺VIP电影?

    环境:windows    python3.7 思路: 1.先选取你要爬取的电影 2.用vip解析工具解析,获取地址 3.写好脚本,下载片断 4.将片断利用电脑合成 需要的python模块: ##第一 ...