划分[CSP2019D2T2][单调队列]

文章目录

  • 题目
  • 部分分做法
    • 12 o p t 12opt 12opt
    • 24 o p t 24opt 24opt
    • 36 o p t 36opt 36opt
    • 64 o p t 64opt 64opt
    • 85 o p t ∼ 100 o p t 85opt\sim 100opt 85opt100opt

题目

一个长度为 n n n 的数组 a a a ,从左到右分段,记第 i i i 段和为 , s i = ∑ j = l i r i a i s_i=\sum_{j=l_i}^{r_i}a_i si=j=liriai ,要求 s i − 1 ≤ s i   ( i > 1 ) s_{i-1}\le s_i\ (i>1) si1si (i>1) ,记权值和 W = ∑ s i 2 W=\sum s_i^2 W=si2,求 W m i n W_{min} Wmin
划分[CSP2019D2T2][单调队列]_第1张图片

部分分做法

12 o p t 12opt 12opt

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

24 o p t 24opt 24opt

可以各种 D p Dp Dp ,主要是水篇幅
f i , j : f_{i,j}: fi,j i i i 个数,最后一段的和为 j 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) fi,j=min{fk,q+j2}(j=sisk)
暴力枚举 O ( n 2 m 2 ) O(n^2m^2) O(n2m2) 再注意一下范围卡卡常

36 o p t 36opt 36opt

f i , j f_{i,j} fi,j i i i 个数,最后一段为 ( j , 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\} fi,j=min{fj,k+(sisj)2} s j − s k ≤ s i − s j s_j-s_k\le s_i-s_j sjsksisj
O ( n 3 ) O(n^3) O(n3)


我们可以尝试对 24 o p t 24opt 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) fi,j=min{fk,q+j2}(j=sisk)
划分[CSP2019D2T2][单调队列]_第2张图片
先枚举 k k k ,再向两边同时拓展,并且记录 f k , q f_{k,q} fk,q 最小值
时间复杂度 O ( n 2 m ) O(n^2m) O(n2m)

64 o p t 64opt 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\} fi,j=min{fj,k+(sisj)2} s j − s k ≤ s i − s j s_j-s_k\le s_i-s_j sjsksisj
同样的优化方法优化 O ( n 3 ) O(n^3) O(n3) 得到 O ( n 2 ) O(n^2) O(n2)
开始扯结论
根据 n 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}} nx1+...+xnni=1nxi2
也就是
s 2 n ≤ W \frac{s^2}{n}\le W ns2W
x 1 = x 2 = . . . = x n x_1=x_2=...=x_n x1=x2=...=xn 时候取等号
那么分的越平均越优秀
一种调整方法:
x a < x b < x c < x d x_axa<xb<xc<xd 并且 x a + x d = x b + x c x_a+x_d=x_b+x_c xa+xd=xb+xc ,那么 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 xb2+xc2xa2+xd2
意味着相邻两段可以通过调整使得值优秀一点
划分[CSP2019D2T2][单调队列]_第3张图片
然后就会使相邻的又有机会调整
划分[CSP2019D2T2][单调队列]_第4张图片
以此类推,最终调整不行时候就是最优解
那么此时显然有最后一段的划分点离右端点最近
那么尝试有关 d p dp dp 决策点的优化

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

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

你可能感兴趣的:(单调队列)