contest2580-c-solution
Contest2580 C Solution
显然包含 \(p\) 的区间可以拆成 \(p\) 左边和 \(p\) 右边两部分,左右分别求最大值加起来就好了。这里以求左边最大值为例:
设 \(s1,s2\) 分别表示 \(a,b\) 的前缀和。
\[\begin{aligned}
\max_{1\le l\le p}\left\{\sum_{i=l}^p(a_i-kb_i)\right\}
&=\max_{1\le l\le p}\left\{s1_p-s1_{l-1}-ks2_p+ks2_{l-1}\right\}\\
&=s1_p-ks2_p+\max_{1\le l\le p}\left\{-s1_{l-1}+ks2_{l-1}\right\}\\
&=s1_p-ks2_p+\max_{0\le l<p}\left\{ks2_l-s1_l\right\}
\end{aligned}\]
把 \(k\) 视作横坐标,\(s2_l\) 视作斜率,\(-s1_l\) 截距,将 \(p\) 从小到大离线后一边从左往右扫一边用李超树维护直线即可。
复杂度 \(\mathcal O(n\log n)\)。

浙公网安备 33010602011771号