1. 程式人生 > >[BZOJ4574][Zjoi2016]線段樹(DP)

[BZOJ4574][Zjoi2016]線段樹(DP)

Address

洛谷P3352
BZOJ4574
UOJ#196
LOJ#2093

Solution

原本是一個期望 DP ,但是由於乘上了 ( n × ( n +

1 ) 2 ) q (\frac{n\times(n+1)}2)^q ,變成了計數 DP ,即求每個位置每種情況下的值之和。
資料是隨機的,假設它們互不相同。先離散化。
很容易想到一個狀態: g
[ i ] [ j ] g[i][j]
表示第 i
i
個數變成從小到大第 j j 個數的方案數。
那麼 x x 位置的答案為:
i = 1 n g [ x ] [ i ] × b i \sum_{i=1}^ng[x][i]\times b_i
其中 b i b_i 為從小到大第 i i 個數的值。
考慮如何求 g [ i ] [ j ] g[i][j] 。如果有 a x = b j a_x=b_j ,那麼無論如何操作, 區間 [ l e x + 1 , r i x 1 ] [le_x+1,ri_x-1] 之外的值永遠不會變成 a x a_x
其中 l e x le_x x x 左邊第一個比 a x a_x 大的數的位置(不存在則為 0 0
r i x ri_x x x 右邊第一個比 a x a_x 大的數的位置(不存在則為 n + 1 n+1
所以再定義狀態 f [ i ] [ l ] [ r ] f[i][l][r] 表示第 i i 輪之後恰好 區間 [ l , r ] [l,r] 變成了 a x a_x 的方案數。
這樣還是不好 (ke) 推。因為如果某次操作發生在 [ u , v ] [u,v] u l e x < v u\le le_x<v ),那麼 l e x le_x 會增加或者 r i x ri_x 會減小(設分別改變至 L L R R ),這樣如果操作的左端點在 [ l e x + 1 , L ] [le_x+1,L] 而右端點大於等於 x x 則修改對 a x a_x 的分佈會特別難處理。
於是我們把狀態中的 l l r r 改為 l e x + 1 le_x+1 r i x 1 ri_x-1 的值,即:
f [ i ] [ l ] [ r ] f[i][l][r] 表示第 i i 輪之後恰好區間 [ l , r ] [l,r] 小於等於 a x a_x 的方案數。
邊界:
f [ 0 ] [ l e x + 1 ] [ r i x 1 ] = 1 f[0][le_x+1][ri_x-1]=1
轉移(1):操作區間不包含 [ l , r ] [l,r]
f [ i ] [ l ] [ r ] + = ( l × ( l 1 ) 2 + ( n r ) ( n r + 1 ) 2 + ( r l + 1 ) ( r l + 2 ) 2 ) f [ i 1 ] [ l ] [ r ] f[i][l][r]+=(\frac{l\times(l-1)}2+\frac{(n-r)(n-r+1)}2+\frac{(r-l+1)(r-l+2)}2)f[i-1][l][r]
其中 l × ( l 1 ) 2 + ( n r ) ( n r + 1 ) 2 + ( r l + 1 ) ( r l + 2 ) 2 \frac{l\times(l-1)}2+\frac{(n-r)(n-r+1)}2+\frac{(r-l+1)(r-l+2)}2