codeforces 938F(dp 高維字首和)

2022-01-29 08:58:21 字數 906 閱讀 2322

題意:

給乙個長度為n的字串,定義$k=\floor$

一共k輪操作,第i次操作要刪除當前字串恰好長度為$2^$的子串

問最後剩餘的字串字典序最小是多少?

分析:

首先很容易得到乙個性質,那就是刪除的那些串是可以不交叉的

很容易想到乙個很簡單的dp

dp[i][j]表示考慮原串的前i位,刪除狀態為j的情況下字典序最小的字串(注意dp裡面儲存的是個字串)

那麼很明顯就是個o(n^3logn)的dp,無法通過

dp裡是乙個字串這個東西是很浪費時間而且很不優美的

根據題解的做法,重新設計狀態

dp[i][j]表示已經確定了最終字串的前i位,目前刪除情況為j的情況下,字典序最小的字串

這樣設計狀態我們會發現乙個性質,那就是如果dp[i][j]所以dp陣列可以用bool值來表示該狀態是否為當前最小的字串

更新狀態的話,根據確定位數i和刪除位數j就知道那些"1"對應字串的下一位是多少了,更新新的最小字串

然後我們要考慮當前階段給後面要刪除幾個數,這裡即使要求滿足若乙個狀態的某個子集是真,那麼它就是真

這用乙個高維字首和解決即可

1 #include2

using

namespace

std;

3const

int maxn=5000;4

char s[maxn+5];5

bool dp[maxn+5][maxn+5];6

intn,l,m;

7string

ans;

8int

main()

932 cout

33 }

view code

高維字首和

給定 num 個三元組 x,y,z 每次詢問滿足 x leq qx y leq qy z leq qz 的三元組個數。x,y,z leq n n leq 10 q num leq 10 6 容易想到維護 pre x,y,z 表示 x leq x y leq y z leq z 的三元組個數 思路1利...

學習筆記 高維字首和

求 sum i n i a i 實際上,這只是高維字首和的一種特殊形式,即每一維的大小都為 2.我們計算矩陣字首和時,通常用的是容斥的方法.設當前要計算 d 維字首和,容斥的複雜度為 sum n binom 2 d 當維數過大時顯然不行.我們考慮計算矩陣字首和的另一種方法 先算出每一列的字首和,然後...

codeforces 835C 二維字首和

題意 給出一些點的值,查詢在乙個時間點一段區間的值。點的值會隨時間每次增加一,然後取 k 1 的模。思路 以為k是 10,所以可以把每個時刻每一段的字首和弄出來,然後查詢的時候就行。ps 乙個點不只是乙個值,在這個地方被卡。二維字首和的構造和維護可以複習一下。includeusing namespa...