杂题

题意

有一个贪心求最大子段和的方法,将负数位置去掉,比较各段和的最大值
现给出长度为\(2n-1\)的序列,对于奇数位置,已经有数了,你需要在偶数位置填入\(\in[-K,K]\)的整数,求正确答案与贪心答案最大差
\(n\le 5000,K\le 10^5\)

做法

结论1:每个位置要么填\(-1\),要么填\(K\)

对于已有数已经为负的情况,是可以分割的。考虑平凡情况:已有数均\(\ge 0\)
\(f_{k,i}\)为前\(i\)个位置,填了\(k\)\(-1\),贪心答案的最小值
\(f_{k,i}=min\{max(f_{k-1,j},sum_i-sum_j)\}\)

结论2:固定\(k,i\),存在分界点,使得在\([1,\alpha]\)最大值为\(sum_i-sum_j\)\((\alpha,i)\)最大值为\(f_{k-1,j}\)

固定\(k\),令\(g_i\)\(f_{k,i}\)的分界点
结论3\(g_i\)是不降的

证明:
满足最大值为\(sum_i-sum_j\)的条件为\(f_{k-1,j}\le sum_i-sum_j\Longrightarrow sum_i\ge f_{k-1,j}+sum_j\)
由于\(sum_i\)是不降的,故分界点也不降

于是可以做到\(O(n^2)\)

posted @ 2020-10-24 22:15  Grice  阅读(83)  评论(0编辑  收藏  举报