划分[CSP2019D2T2][单调队列]

题目

一个长度为 nn 的数组 aa ,从左到右分段,记第 ii 段和为 ,si=j=liriais_i=\sum_{j=l_i}^{r_i}a_i ,要求 si1si (i>1)s_{i-1}\le s_i\ (i>1) ,记权值和 W=si2W=\sum s_i^2,求 WminW_{min}
划分[CSP2019D2T2][单调队列]

部分分做法

12opt12opt

枚举分段点然后检验
时间复杂度 O(2nn)O(2^nn)

24opt24opt

可以各种 DpDp ,主要是水篇幅
fi,jf_{i,j}:ii 个数,最后一段的和为 jj 目前最小和
fi,j=min{fk,q+j2}(j=sisk)f_{i,j}=min\{f_{k,q}+j^2\}(j=s_i-s_k)
暴力枚举 O(n2m2)O(n^2m^2) 再注意一下范围卡卡常

36opt36opt

fi,jf_{i,j}ii 个数,最后一段为 (j,i](j,i] 的目前最小和
fi,j=min{fj,k+(sisj)2}f_{i,j}=min\{f_{j,k}+(s_i-s_j)^2\} sjsksisjs_j-s_k\le s_i-s_j
O(n3)O(n^3)


我们可以尝试对 24opt24opt 的枚举进行优化
fi,j=min{fk,q+j2}(j=sisk)f_{i,j}=min\{f_{k,q}+j^2\}(j=s_i-s_k)
划分[CSP2019D2T2][单调队列]
先枚举 kk ,再向两边同时拓展,并且记录 fk,qf_{k,q} 最小值
时间复杂度 O(n2m)O(n^2m)

64opt64opt

fi,j=min{fj,k+(sisj)2}f_{i,j}=min\{f_{j,k}+(s_i-s_j)^2\} sjsksisjs_j-s_k\le s_i-s_j
同样的优化方法优化 O(n3)O(n^3) 得到 O(n2)O(n^2)
开始扯结论
根据 nn 元均值不等式可得:
x1+...+xnni=1nxi2n\frac{x_1+...+x_n}{n}\le \sqrt{\frac{\sum_{i=1}^nx_i^2}{n}}
也就是
s2nW\frac{s^2}{n}\le W
x1=x2=...=xnx_1=x_2=...=x_n 时候取等号
那么分的越平均越优秀
一种调整方法:
xa<xb<xc<xdx_a<x_b<x_c<x_d 并且 xa+xd=xb+xcx_a+x_d=x_b+x_c ,那么 xb2+xc2xa2+xd2x_b^2+x_c^2\le x_a^2+x_d^2
意味着相邻两段可以通过调整使得值优秀一点
划分[CSP2019D2T2][单调队列]
然后就会使相邻的又有机会调整
划分[CSP2019D2T2][单调队列]
以此类推,最终调整不行时候就是最优解
那么此时显然有最后一段的划分点离右端点最近
那么尝试有关 dpdp 决策点的优化

85opt100opt85opt\sim 100opt

定义 fif_{i}ii 的最优决策点,那么类似 O(n2)O(n^2) 的有
枚举 ii 的决策点 jj 来更新 fif_i
SjSfjSiSjS_{j}-S_{f_j}\le S_i-S_{j}
移项可得 2SjSfjSi2*S_{j}-S_{f_j}\le S_i
发现右边是只和决策点 jj 相关的代数式记为 gj=2SjSfjg_j=2*S_{j}-S_{f_j}
gjg_j 肯定越小越好
考虑两个决策点 k<jk<j 并且 gk>gjg_k>g_j 那么永远只会选择 jj
也就是可以考虑维护一个单调递增的栈,然后用 SiS_i 去二分
然后发现 SiS_i 也有单调性就可以做到 O(n)O(n)