jiangly CSP2020模擬賽 部分題解


T3

思路:按位分治

大概就是從高到低考慮二進制的每一位

\(solve(S,i)\)表示當前我們考慮在\(S\)這個集合中選,當前只需要考慮只取出第\(i\)位及以下的限制\(x\),滿足題意的方案數

那么對限制的第\(i\)位,我們把\(S\)中第\(i\)位是\(1\)和是\(0\)的分成兩個集合\(A\)\(B\)

接下來討論

如果限制的這一位是\(1\)的的話,我們顯然只能在\(A\)\(B\)中各至多選擇一個,否則異或出來必然存在這一位是\(0\)

那么此時我們就滿足了\(x\)\(i\)位的限制

於是這一個我們可以考慮對\(A\)建一棵trie,對\(B\)中的每一個數在trie數上統計滿足\(x\)的后\(i-1\)位的方案數,這一部分總復雜度是\(O(n\log a_i)\)

如果限制的這一位是\(0\)的的話,我們從兩個集合中各拉出來一個數異或起來顯然是\(>=x\)的,所以只需要考慮A和B內部的選擇,我們發現這變成了兩個子問題\(solve(A,i-1)\) \(solve(B,i-1)\)的答案的積

我們發現總共分治\(\log a_i\)層,每層總個數不超過\(n\),所以這部分總復雜度也是\(O(n\log a_i)\)

總復雜度\(O(n\log a_i)\)


T4

思路:容斥

我們考慮把每個\(k\)的答案分開來計算

首先我們發現,對於操作次數為\(k\)的答案是所有最長上升子串長度至少是\(n-k\)的排列的個數

這一點不難證明,此處略去

我們考慮用總排列數減去所有不含長度至少是\(n-k\)的上升子串的方案數

這一部分我們可以考慮容斥,用總方案數減去欽定了一個長度是\(n-k\)的上升子串的方案,再加上兩個\(n-k\)的上升子串的方案數....

但是我們注意到多個重疊的上升子串是需要合並的

於是我們就可以把長度為\(x\)的上升子串的所有能夠構成他的方案的容斥系數求出來,這里我們認為不屬於任意一個上升子串的單個數,其長度是\(1\)

然后這里可以dp,大概就是

\(f[1]=1\ \ \ \ \ f[n-k]=-1\)

\(f[i]=-\sum_{j=1}^{n-k-1}f[i-j]\)

得到這個以后就可以計算了

我們設\(g[i]\)表示總長度是i的所有排列方案的容斥系數總和

那么\(g[i]=\sum_{j=1}^{i}g[i-j]f[j]\)

但是我們還要給每一個上升子串分配他是哪些數怎么搞

我們發現分配方案恰為\(\frac{n!}{\prod a_i!}\)其中\(a_i\)是我們欽定的每一個上升子串的長度

\(n!\)可以提出來,\(a_i!\)這個東西是可以揉到容斥系數里的,即對於dp出來的\(f_i\)都乘上\(\frac{1}{i!}\)

單次dp復雜度是\(O(n^2)\),總復雜度是\(O(n^3)\)

過不了怎么辦?

我們把dp出來的\(f[i]\)打出來,發現一個驚人的事情!

對於\(i=(n-k)*t\)\(f[i]\)\(-1\)

對於\(i=(n-k)*t+1\)\(f[i]\)\(1\)

其他的都是\(0\)

其實這一點非常好證,此處略去

於是我們的轉移只有\(n/(n-k)\)

單次dp復雜度降至\(O(\frac{n^2}{n-k})\),總復雜度降至\(O(n^2\ln n)\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM