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_r\le (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\)的位置,然后更新答案即可