題意:
給乙個長度為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 #include2view codeusing
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 }
高維字首和
給定 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...