明明 $O(n \sqrt{n})$ 可以的……
题意
给定 $n \le 10^5$ 个数 $0 \le h_i \le 10^9$ ,对于每个数求出一个最小的 $p_i$ 使得 $h_j \le h_i + p_i - \sqrt{\mid i - j \mid}$ 对任意 $h_j$ 成立
正常做法
化式子为 $h_j - h_i + \sqrt{\mid i - j \mid} \le p_i$ ,直接暴力是 $n^2$ 的,麻烦点是那个根号,考虑枚举 $k = \sqrt{\mid i - j \mid}$ ,对于枚举到的每个 $k$ ,扫描整个数列,对于当前点 $i$ ,找到满足条件的最大 $h_j$ (用 ST 表可以做到 $O(1)$ ),跟新答案,时间复杂度为 $O(n \sqrt{n})$
代码
1 |
|
蒟蒻我到这就结束了,但总有巨佬觉得时间还可以再优
巨佬的时间
某位巨佬想出了 $O(n \log n)$ 的做法
首先去掉绝对值,只考虑 $j < i$ 的情况,设 d[i]
表示“第 $i$ 个数对所有 $j \le i$ 满足条件的最小 $p_i$ ”,然后倒过来再做一遍即可,显然 $d[i] = \max(h_j - h_i + \sqrt{i - j})$
然后,考虑根号,注意到这是典型的 $d[i] = \max_{j = 1}^{i - 1} (d[j] + w(j, i))$ 的形式,考虑四边形不等式,那么就要证明 $\forall a < b, w(a, b + 1) + w(a + 1, b) \le w(a, b) + w(a + 1, b + 1)$ (这里因为 $\max$ 所以符号和 $\min$ 相反),对于本题来说 $\sqrt{(b + 1) - a} + \sqrt{b - (a + 1)} \ge \sqrt{b - a} + \sqrt{(b + 1) - (a + 1)}$ 即 $\sqrt{b - a + 1} + \sqrt{b - a - 1} \ge 2\sqrt{b - a}$ 设 $t = b - a$ ,我们要证明 $\sqrt{t + 1} + \sqrt{t - 1} \ge 2 \sqrt{t}$ ,两边平方即可
因此决策具有单调性,直接用队列 + 二分维护三元组即可,巨佬说因为转移顺序没有要求,所以可以分治,但是我不会,不管如何实现,时间为 $O(n \log n)$
贺的巨佬的代码
1 |
|