DUT Star Weekly Contest #3 Problem F Solution

题目链接

问题转化

$$a_i+a_j+(i-j)^2=a_i+i^2+a_j+j^2-2ij$$

令 $b_i=a_i+i^2$ , 问题化为: 求

$$\max {b_i+b_j-2ij},\quad (1 \le i, j \le n, i \ne j).$$

固定 $i$ , 不妨设 $j<i$ , 定义函数

\begin{equation}
F_i(j) = b_j-2ij,\quad (1 \le j< i)
\end{equation}

问题化成: 求

\begin{equation}
OPT_i = \max{F_i(j)}.
\label{OPT}
\end{equation}

设 $ k < j < i $ , 我们来推导取 $j$ 优于 $k$ 的条件:

\[ b_j - 2 i j > b_k-2ik \Longrightarrow (b_j-b_k) > 2i(j-k) \]


\begin{equation}
\dfrac{b_j - b_k}{j-k} > 2i
\label{C}
\end{equation}

将 \eqref{C} 式左边记作 $g(k, j)$ , 右边记作 $f(i)$ , 对于 $OPT_i$ 而言, $j$ 优于 $k$ 的条件为:

\begin{equation}
g(k,j) > f(i) \label{general_C}
\end{equation}

考虑一平面点集 $P = \{ p_i: (i, b_i) \}, 1 \le i \le n$, 则 $g(k, j)$ 表示斜率, 显然有
$$ g(j, k) = g(k, j) $$

斜率单调性优化

为了快速求 $OPT_i$, 借助 $\eqref{general_C}$ , 我们研究一下哪些 $j\ (1 \le j < i)$ 可能是 $OPT_i$ 的唯一解. 有如下结论:

设 $j_1 < j_2 < j_3 $ ,
$g(j_1, j_2) \le g(j_2, j_3) \implies \forall i > j_3, \quad j_2$ 不优于 $j_1$ 或者 $j_2$ 不优于 $j_3$

证明:

$\forall i > j_3$,
若 $j_2$ 优于 $j_3$ 即 $g(j_2, j_3)<f(i)$, 则 $g(j_1, j_2) \le g(j_2, j_3) < f(i)$ 即 $j_1$ 优于 $j_2$
若 $j_2$ 优于 $j_1$ 即 $g(j_1, j_2)>f(i)$, 则 $g(j_2, j_3) \ge g(j_1, j_2) > f(i)$ 即 $j_3$ 优于 $j_2$

根据这个结论, 为了求解 $OPT_i$, 可以维护一个点的队列使得

  1. 相邻两点的斜率严格递减.
  2. 任意相邻两点的斜率都满足 \eqref{general_C} 式

这样队尾的点即为最优.

由 $n$ 个点构造这样的一个队列的复杂度是 $O(n)$. 另外, 可以令队列中的点只满足上述条件1, 然后从后向前遍历或者二分寻找「与前一个点斜率仍满足 $\eqref{general_C}$ 式的最末的那个点」.

然而我们并不能对每个 $OPT_i$ 都从头求一遍, 那样复杂度和暴力一样. 对于一般情况, 我们可以动态维护一个斜率严格递减的队列, 在上面二分求解, 复杂度是 $O(n\log n)$ . 当 $f(i)$ 单调时, 复杂度可以做到 $O(n)$ :

  1. $f(i)$ 递增: 在斜率单调递减的基础上, 每次在求解 $OPT_i$ 之前, 若队尾点满足 $g(j_1, j_2) \le f(i)$ , 则队尾点出队, 反复该操作. 用队尾元素计算DP值.
  2. $f(i)$ 递减: 在斜率单调递减的基础上, 每次在求解 $OPT_i$ 之前, 若队首点符合 $g(j_1, j_2) \ge f(i)$ , 则队首点出队, 反复该操作. 用队首元素计算DP值.

这一步可以称作 EXPOSING, 很形象, 它的目的正是将最优的转移点暴露出来.

总结

形如

\begin{equation}
g(k,j) \lessgtr f(i)
\label{condition}
\end{equation}

, 左边 $g(k,j)$ 是某种斜率的形式, 都可以通过维护斜率单调的队列来优化. 一般情况下, 复杂度可优化到 $O(n\log n)$ , 当 $f(i)$ 单调时, 复杂度可进一步优化到 $O(n)$ :

  1. 形如 $g(k,j)>f(i)$ , 维护一个相邻点斜率严格递减的点列.
  2. 形如 $g(k,j)<f(i)$ , 维护一个相邻点斜率严格递增的点列.

例题

CF1083E

转载于:https://www.cnblogs.com/Patt/p/6132081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值