感覺再不寫做題記錄會廢的
這個部落格用慣了,懶得再用原來那個寫了
Latex不是很會,應該會比較亂
- CF1995D
首先可以轉化一下題意,變成先選出一個字符集(必須包含字串的最後一個字母),使得字符集裡的字母在字串中的位置前後相差不超過k,詢問字符集的大小最小為多少
加上字符集<=18,這個時候應該能想到跟二進位制列舉相關。但列舉符合條件的情況複雜度要炸,於是我們考慮不符合條件的情況,即某一段連續k個字元都不在我們列舉的字符集中,這時這個字符集就是不合法的,那麼對於每一段連續的k個字元我們都把它用二進位制表示出來,記錄到陣列裡面,表示同時沒有這些字元的字符集是不合法的,接著我們在記錄的陣列裡做一個高維字首和,最後二進位制列舉每一個沒被標記的點,用ans對他們1的個數取min,這道題就做完了
- P3899
答案由兩部分構成
-
b在a的上面,此時可以直接算: \(\min (K,depth[a]) \cdot size[a]\)
-
b在a的下面,每個點以dfn為root下標,dep為樹內下標開一顆線段樹(動態開點),遍歷樹的時候把它變成一個類似字首和的東西,即dfn[u]的樹以dfn[u]-1的樹為基礎構建,然後詢問直接回答root[dfn[p]+size[p]-1]的樹減去root[dfn[p]-1]的樹在dep[p]+1到dep[p]+K上的貢獻即可。