contest2580-c-solution

Contest2580 C Solution

link

显然包含 \(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)\)

posted @ 2024-02-29 07:55  iorit  阅读(12)  评论(0)    收藏  举报