划分[CSP2019D2T2][单调队列]

题目

一个长度为 n n 的数组 a a ,从左到右分段,记第 i i 段和为 , s i = j = l i r i a i s_i=\sum_{j=l_i}^{r_i}a_i ,要求 s i 1 s i   ( i > 1 ) s_{i-1}\le s_i\ (i>1) ,记权值和 W = s i 2 W=\sum s_i^2 ,求 W m i n W_{min}
在这里插入图片描述

部分分做法

12 o p t 12opt

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

24 o p t 24opt

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

36 o p t 36opt

f i , j f_{i,j} i i 个数,最后一段为 ( j , i ] (j,i] 的目前最小和
f i , j = m i n { f j , k + ( s i s j ) 2 } f_{i,j}=min\{f_{j,k}+(s_i-s_j)^2\} s j s k s i s j s_j-s_k\le s_i-s_j
O ( n 3 ) O(n^3)


我们可以尝试对 24 o p t 24opt 的枚举进行优化
f i , j = m i n { f k , q + j 2 } ( j = s i s k ) f_{i,j}=min\{f_{k,q}+j^2\}(j=s_i-s_k)
在这里插入图片描述
先枚举 k k ,再向两边同时拓展,并且记录 f k , q f_{k,q} 最小值
时间复杂度 O ( n 2 m ) O(n^2m)

64 o p t 64opt

f i , j = m i n { f j , k + ( s i s j ) 2 } f_{i,j}=min\{f_{j,k}+(s_i-s_j)^2\} s j s k s i s j s_j-s_k\le s_i-s_j
同样的优化方法优化 O ( n 3 ) O(n^3) 得到 O ( n 2 ) O(n^2)
开始扯结论
根据 n n 元均值不等式可得:
x 1 + . . . + x n n i = 1 n x i 2 n \frac{x_1+...+x_n}{n}\le \sqrt{\frac{\sum_{i=1}^nx_i^2}{n}}
也就是
s 2 n W \frac{s^2}{n}\le W
x 1 = x 2 = . . . = x n x_1=x_2=...=x_n 时候取等号
那么分的越平均越优秀
一种调整方法:
x a < x b < x c < x d x_a<x_b<x_c<x_d 并且 x a + x d = x b + x c x_a+x_d=x_b+x_c ,那么 x b 2 + x c 2 x a 2 + x d 2 x_b^2+x_c^2\le x_a^2+x_d^2
意味着相邻两段可以通过调整使得值优秀一点
在这里插入图片描述
然后就会使相邻的又有机会调整
在这里插入图片描述
以此类推,最终调整不行时候就是最优解
那么此时显然有最后一段的划分点离右端点最近
那么尝试有关 d p dp 决策点的优化

85 o p t 100 o p t 85opt\sim 100opt

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

猜你喜欢

转载自blog.csdn.net/qq_37555704/article/details/107480005