题意

  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. JavaScript 控制台打印window对象

    示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  2. eclipse控制台界面乱码问题

    一.首先,eclipse的控制台必须用GBK编码,必须满足以下两个条件: 1.Windows---->Preferences---->Workspace---->Text file ...

  3. Docker 运行hello world

    Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world docker run ubuntu:15.10 /bin/echo ...

  4. 怎样解决SQL Server内存不断增加问题

    原文:怎样解决SQL Server内存不断增加问题 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn. ...

  5. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    MFC中ASSERT作为断言语句,括号内内容为TRUE,继续执行:为FALSE终止执行.之后取得当前窗口的系统菜单,在这个菜单中添加字符串资源IDS_ABOUTBOX和菜单资源IDM_ABOUTBOX ...

  6. Forest Program(dfs方法---树上的环)

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=6736 沙漠中的每一个连通块都是一棵仙人掌:一个连通块是一棵仙人掌当且仅当连通块中不存在重边和自环,并且每一 ...

  7. 洛谷P1088 火星人

    //其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...

  8. linux命令 ip

  9. 【计数】Simple Addition Expression

    [来源] 2008年哈尔滨区域赛 [题目链接]: http://acm.hdu.edu.cn/showproblem.php?pid=2451 [参考博客]: HDU 2451 Simple Addi ...

  10. Linux中设置系统时间和时区

    之前公司里有需求要做机器与服务器做时间同步,服务器发送时间戳和时区过来,机器这边根据接收到的时间戳和时区来改时间. 其实很简单,百度上应该也有很多博客有类似的教程,但是这里强调一点,百度上的博客里写的 ...