我一般采用的方法是 截距式优化。
更快速 更正轨的是采用代数法进行斜率优化 这种方法 使用较多且使用范围广泛。
注意:斜率优化和决策单调性 含义不相同 决策单调性一般是四边形不等式优化出来的结果。
而斜率优化只是在解决一些特定问题寻找最优决策时的优化。
通常题目可能可以同时进行斜率优化或决策单调性优化 但决策单调性优化有下界复杂度Qlog 而斜率优化如果斜率单调通常可以使O(Q)的。
LINK:CF631E Product Sum
对于一个数列我们定义其代价为 \(\sum_{i=1}{n}i\cdot a_i\)
可以将某个i交换到j 使得j之后的数字往后推形成的新的序列最大。
显然我们可以\(n^2\)暴力之后O(1)算出贡献。但是这不够优秀。
i可以向前也可以向后 我们先考虑向前的方向。显然设f[i]表示i和1~i这些位置中的一个交换得到的最大价值。
设原本的初始值为m.那么f[i]可以表示 换过后的值和初始值的差。
\(f_i=(j-i)\cdot a_i+sum_{i-1}-sum_{j-1}\)
这个时候一般是要对比一下两个决策 再来一个决策k \(1\leq k<j\)
\(f_i=(k-i)\cdot a_i+sum_{i-1}-sum_{k-1}\)
我们可以让他们来一个 大小关系的比较看能得出什么 假设j决策优于k决策。
显然有 \((j-i)\cdot a_i+sum_{i-1}-sum_{j-1}\geq (k-i)\cdot a_i+sum_{i-1}-sum_{k-1}\)
化简一下 \((j-k)\cdot a_i\geq sum_{j-1}-sum_{k-1}\to a_i\geq \frac{sum_{j-1}-sum_{k-1}}{j-k}\)
到这里 可以发现右边 神似我们的斜率式子 也就是 在一个二维坐标系中我们以w为下标 \(sum_{w-1}\)为总坐标
右边其实是我们坐标系中的一个两点的斜率 也同样说明了 如果我们的\(a_i\)大于这个斜率说明了j是比k优的的。
此时 如果只有一个斜率没的说比一下即可 有三个点的时候 我们可以来分析一下他们之间的关系 我分析的话过于抽象 可以自己分析 j1,j2,j3看一下他们有什么关系。
可以发现上凸包一定不优策略 我们删掉一些点形成下凸 斜率单调递增。
接下来直接在凸包上线性规划即可 由于这道题 ai不单调 所以需要在凸包上二分。
反着的过程也同样如此。
其实 代数法优化的优越性 这道题没体现出来 但是简洁性还是很棒的。