CF660F题解

(val_{i,j})为区间([l,r])的答案

根据题意,我们可以维护(a_i)(i* a_i)的前缀和(sum1,sum2)

(val_{l,r}=sum2[r]-sum2[l-1]-(l-1)*(sum1[r]-sum1[l-1]))

我们枚举(r)

对于所有(val_{l',r}le val_{l,r}),有

((l'-1)*sum1_{l'-1}-sum2_{l'-1}-(l'-1)*sum1_rle (l-1)*sum1_{l-1}-sum2_{l-1}-(l-1)*sum1_r)

我们发现这个式子可以斜率优化

斜率优化一般把我们要的最大值/最小值也就是这里的(val_{l,r})放在(b)里面,那么((l-1)*sum1_{l-1}-sum2_{l-1}-(l-1)*sum1_r)就可以表示成(y-kx)

把跟(r)有关的放在(k)里面,(k=sum1_r)

于是(b=val_{l,r}-sum_r,x=l-1,y=(l-1)*sum1_{l-1})

因为是最大值,我们维护一个上凸壳每次二分找到第一个斜率小于(sun1_r)的位置,然后更新答案即可

原文地址:https://www.cnblogs.com/CHK666/p/15358764.html