不带 log 的时间复杂度证明
查看原帖
不带 log 的时间复杂度证明
35347
wangzhifang楼主2024/4/6 20:37

只是在证明前简述了做法,应该不算评论区发题解吧,而且唯一一篇这个复杂度没证明的题解也压在最下面估计没人看。

全是自己口胡的,没写过,应该没假吧。

算法概述

可以容易地感受到 >n> \sqrt{n} 且 ⩽nlog⁡n\leqslant \sqrt{n \log n} 的部分用暴力依然有点浪费,>nlog⁡n> \sqrt{n \log n} 且 <nlog⁡n< \sqrt{n} \log n 的二分也有点浪费。

令 aia_i 为答案 ⩾i\geqslant i 的 kk 右端点,我们考虑从 ai+1a_{i + 1} 推出 aia_i。

类似 finger search,我们在倍增时先不断尝试 +1,+2,+4,+8,…+1, +2, +4, +8, \dots 直至失败,然后向下枚举 22 的幂尝试 …,+8,+4,+2,+1\dots, +8, +4, +2, +1。复杂度为 Θ(log⁡(ai+1−ai+1))\Theta(\log(a_{i + 1} - a_i + 1)) 次检验与 Θ(1)\Theta(1) 的额外复杂度而无法全部取到 Θ(log⁡n)\Theta(\log n)。而且可以利用失败的查询做一些优化,这里不赘述(类似 ai=ai+1a_i = a_{i + 1} 检验一次后即可跳过后续相同检验,除了这个在 i>ni > \sqrt{n} 的表现之外均为常数优化,注意自上而下二分虽然跑满但若视作一倍常数,finger search 具有两倍常数,复用了信息后应该和整体二分相比只是跳的步长对齐了 22 的幂)。

复杂度证明

因此我们需要的复杂度分析相当于:a0=n,an+1=0,∀i∈[1,n]∩N,ai∈[ai+1,n/i]∩Na_0 = n, a_{n + 1} = 0, \forall i \in [1, n] \cap \mathbb N, a_i \in [a_{i + 1}, n / i] \cap \mathbb N,最大化 ∑i=1nlog⁡(ai−ai+1+1)\sum_{i = 1}^n \log(a_i - a_{i + 1} + 1)。

注意到若 ai−ai+1⩽ai+1−ai+2a_i - a_{i + 1} \leqslant a_{i + 1} - a_{i + 2} 时交换 ai−ai+1a_i - a_{i + 1} 与 ai+1−ai+2a_{i + 1} - a_{i + 2} 仍满足约束且不影响结果,因此不妨假设 ai−ai+1⩾ai+1−ai+2a_i - a_{i + 1} \geqslant a_{i + 1} - a_{i + 2}。我们可以从 ∀i∈[1,n]∩N,ai=⌊n/i⌋\forall i \in [1, n] \cap \mathbb N, a_i = \lfloor n / i \rfloor 开始,每次对 ai−ai+1⩾ai+1−ai+2>0a_i - a_{i + 1} \geqslant a_{i + 1} - a_{i + 2} > 0 的某个 i∈[0,n)∩Ni \in [0, n) \cap \mathbb N 执行 ai+1←ai+1−1a_{i + 1} \leftarrow a_{i + 1} - 1 得到任意满足上述约束的 aa。具体地:

  • 注意到 a⌊n⌋⩽n/⌊n⌋a_{\left\lfloor \sqrt n \right\rfloor} \leqslant n / \left\lfloor \sqrt n \right\rfloor,∑i=⌊n⌋nlog⁡(ai−ai+1+1)=O(n)\sum_{i = \left\lfloor \sqrt n \right\rfloor}^n \log(a_i - a_{i + 1} + 1) = O\left(\sqrt n\right)。

  • 注意到对于 2⩽x⩽y,log⁡(x−1)+log⁡(y+1)⩽log⁡x+log⁡y2 \leqslant x \leqslant y, \log (x - 1) + \log (y + 1) \leqslant \log x + \log y。

  • 注意到 ∫1nlog⁡(n/x−n/(x+1))d⁡ ⁣x=∫1nlog⁡(n/(x2+x))d⁡ ⁣x=Θ(n)\int_1^{\sqrt{n}} \log(n / x - n/(x + 1)) \operatorname{d}\! x = \int_1^{\sqrt{n}} \log(n / (x^2 + x)) \operatorname{d}\! x = \Theta\left(\sqrt n\right)。

洛谷还是有题解是正确的 Θ(nn)\Theta\left(n \sqrt{n}\right) 的,只是没写证明:https://www.luogu.com.cn/article/f9wksdt9。整体二分与上述做法本质上基本相同,只是离线后交换了一些检验顺序。

2024/4/6 20:37
加载中...