题目
一个长度为 n 的数组 a ,从左到右分段,记第 i 段和为 ,si=∑j=liriai ,要求 si−1≤si (i>1) ,记权值和 W=∑si2,求 Wmin
![划分[CSP2019D2T2][单调队列] 划分[CSP2019D2T2][单调队列]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMy9lNzBiODU4ZDZhYjQ0MTVkMTFjYzEzNDBmMGI0MTBkNS5wbmc=)
部分分做法
12opt
枚举分段点然后检验
时间复杂度 O(2nn)
24opt
可以各种 Dp ,主要是水篇幅
fi,j: 前 i 个数,最后一段的和为 j 目前最小和
fi,j=min{fk,q+j2}(j=si−sk)
暴力枚举 O(n2m2) 再注意一下范围卡卡常
36opt
fi,j 前 i 个数,最后一段为 (j,i] 的目前最小和
fi,j=min{fj,k+(si−sj)2} sj−sk≤si−sj
O(n3)
我们可以尝试对 24opt 的枚举进行优化
fi,j=min{fk,q+j2}(j=si−sk)
![划分[CSP2019D2T2][单调队列] 划分[CSP2019D2T2][单调队列]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIyNS82YzM0ZGU2ZTBlNjRhODQ4OTA5NmQ1NDA5OWZlZjcwOS5wbmc=)
先枚举 k ,再向两边同时拓展,并且记录 fk,q 最小值
时间复杂度 O(n2m)
64opt
fi,j=min{fj,k+(si−sj)2} sj−sk≤si−sj
同样的优化方法优化 O(n3) 得到 O(n2)
开始扯结论
根据 n 元均值不等式可得:
nx1+...+xn≤n∑i=1nxi2
也就是
ns2≤W
当 x1=x2=...=xn 时候取等号
那么分的越平均越优秀
一种调整方法:
设 xa<xb<xc<xd 并且 xa+xd=xb+xc ,那么 xb2+xc2≤xa2+xd2
意味着相邻两段可以通过调整使得值优秀一点
![划分[CSP2019D2T2][单调队列] 划分[CSP2019D2T2][单调队列]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ3Ny9kZGYzMGJhM2M5NDBmNWE1MzY0MDM4ODQwZTViMjg4NS5wbmc=)
然后就会使相邻的又有机会调整
![划分[CSP2019D2T2][单调队列] 划分[CSP2019D2T2][单调队列]](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc3OC82ZTdjMTM5Y2QzODRjZDFlNDc3YTg5OGI3NDNkOWZiYS5wbmc=)
以此类推,最终调整不行时候就是最优解
那么此时显然有最后一段的划分点离右端点最近
那么尝试有关 dp 决策点的优化
85opt∼100opt
定义 fi 为 i 的最优决策点,那么类似 O(n2) 的有
枚举 i 的决策点 j 来更新 fi
Sj−Sfj≤Si−Sj
移项可得 2∗Sj−Sfj≤Si
发现右边是只和决策点 j 相关的代数式记为 gj=2∗Sj−Sfj
gj 肯定越小越好
考虑两个决策点 k<j 并且 gk>gj 那么永远只会选择 j
也就是可以考虑维护一个单调递增的栈,然后用 Si 去二分
然后发现 Si 也有单调性就可以做到 O(n)