Luogu P4072 [SDOI2016]征途(坑)

版权声明:转载注明出处,部分带(坑)文章谢绝转载。 https://blog.csdn.net/linjiayang2016/article/details/88993824

考虑前 k k 项的方差。
s 2 = 1 k i = 1 k ( v ˉ v i ) 2 s = 1 k ( i = 1 k ( v ˉ 2 + v i 2 2 v ˉ v i ) ) = 1 k ( i = 1 k v ˉ 2 + i = 1 k v i 2 i = 1 k 2 v ˉ v i ) ) = 1 k ( k v ˉ 2 + i = 1 k v i 2 2 v ˉ i = 1 k v i ) ) = v ˉ 2 + 1 k i = 1 k v i 2 2 k v ˉ i = 1 k v i = 1 k 2 ( i = 1 k v i ) 2 + 1 k i = 1 k v i 2 2 k v ˉ i = 1 k v i = 1 k 2 ( i = 1 k v i ) 2 + 1 k i = 1 k v i 2 2 k 2 ( i = 1 k v i ) 2 = 1 k i = 1 k v i 2 1 k 2 ( i = 1 k v i ) 2 \begin{aligned} s^2&=\frac{1}{k}\sum_{i=1}^k(\bar{v}-v_i)^2s\\ &=\frac 1k\Big( \sum_{i=1}^k (\bar v^2+v_i^2-2\bar vv_i)\Big)\\ &=\frac 1k\Big( \sum_{i=1}^k \bar v^2+\sum_{i=1}^kv_i^2-\sum_{i=1}^k2\bar vv_i)\Big)\\ &=\frac 1k\Big( k\bar v^2+\sum_{i=1}^kv_i^2-2\bar v\sum_{i=1}^kv_i)\Big)\\ &=\bar v^2+\frac 1k\sum_{i=1}^kv_i^2-\frac 2k\bar v\sum_{i=1}^kv_i\\ &=\frac 1{k^2}\Big(\sum_{i=1}^k v_i\Big)^2+\frac 1k\sum_{i=1}^kv_i^2-\frac 2k\bar v\sum_{i=1}^kv_i\\ &=\frac 1{k^2}\Big(\sum_{i=1}^k v_i\Big)^2+\frac 1k\sum_{i=1}^kv_i^2-\frac 2{k^2}\Big(\sum_{i=1}^kv_i\Big)^2\\ &=\frac 1k\sum_{i=1}^kv_i^2-\frac 1{k^2}\Big(\sum_{i=1}^kv_i\Big)^2\\ \end{aligned}

m m 项的方差为 s 2 = 1 m i = 1 m v i 2 1 m 2 ( i = 1 m v i ) 2 s^2=\frac 1m\sum_{i=1}^mv_i^2-\frac 1{m^2}\Big(\sum_{i=1}^mv_i\Big)^2

乘上 m 2 m^2 ,得: s 2 m 2 = m i = 1 m v i 2 ( i = 1 m v i ) 2 s^2m^2=m\sum_{i=1}^mv_i^2-\Big(\sum_{i=1}^mv_i\Big)^2

由于 ( i = 1 m v i ) 2 \Big(\sum\limits_{i=1}^mv_i\Big)^2 固定不变,因此要让 s 2 m 2 s^2m^2 最小,只需要最小化 i = 1 m v i 2 \sum\limits_{i=1}^mv_i^2 即可。
定义: f [ i ] [ j ] f[i][j] 表示前面 i i 个数分成 j j 段的最小价值, s u m [ i ] = i = 1 i a i sum[i]=\sum\limits_{i=1}^i a_i
转移: f [ i ] [ j ] = min k = 1 i 1 f [ k ] [ j 1 ] + ( s u m [ i ] s u m [ k ] ) 2 f[i][j]=\min\limits_{k=1}^{i-1}f[k][j-1]+(sum[i]-sum[k])^2
时间复杂度 Θ ( n 3 ) \Theta(n^3) ,考虑斜率优化。
k a < k b k_a<k_b k a k_a 优于 k b k_b ,则有:
f [ k a ] [ j 1 ] + ( s u m [ i ] s u m [ k a ] ) 2 < f [ k b ] [ j 1 ] + ( s u m [ i ] s u m [ k b ] ) 2 f[k_a][j-1]+(sum[i]-sum[k_a])^2<f[k_b][j-1]+(sum[i]-sum[k_b])^2

f [ k a ] [ j 1 ] + 2 s u m [ i ] s u m [ k a ] + s u m [ k a ] 2 < f [ k b ] [ j 1 ] + 2 s u m [ i ] s u m [ k b ] + s u m [ k b ] 2 f[k_a][j-1]+2sum[i]*sum[k_a]+sum[k_a]^2<f[k_b][j-1]+2sum[i]*sum[k_b]+sum[k_b]^2

化简: ( f [ k a ] [ j 1 ] + s u m [ k a ] 2 ) ( f [ k b ] [ j 1 ] + s u m [ k b ] 2 ) < 2 s u m [ i ] × ( s u m [ k a ] s u m [ k b ] ) (f[k_a][j-1]+sum[k_a]^2)-(f[k_b][j-1]+sum[k_b]^2)<2sum[i]\times(sum[k_a]-sum[k_b])

整理:整理: ( f [ k a ] [ j 1 ] + s u m [ k a ] 2 ) ( f [ k b ] [ j 1 ] + s u m [ k b ] 2 ) ( s u m [ k a ] s u m [ k b ] ) < 2 s u m [ i ] \frac{(f[k_a][j-1]+sum[k_a]^2)-(f[k_b][j-1]+sum[k_b]^2)}{(sum[k_a]-sum[k_b])}<2sum[i]

单调队列维护递增斜率即可,转移时间复杂度 Θ ( 1 ) \Theta(1) ,总时间复杂度 Θ ( n 2 ) \Theta(n^2)

猜你喜欢

转载自blog.csdn.net/linjiayang2016/article/details/88993824