退役前的做題記錄 Ⅱ
被群友發現是照着 zsy 的題單刷的了 /kel
https://www.cnblogs.com/zhoushuyu/p/10492689.html
我什么時候變成日更博主了 /kk
#2712. 「BalkanOI 2018 Day1」Minmaxtree
比較 naive 的題,不難得到一條邊的上下界,那么這條邊的邊權選上下界一定更優,所以就是一個裸的二分圖匹配了,得到上下界可以使用並查集優化下。
CF1142D Foreigner
非常牛逼啊。
發現這樣一件事,對於一個好數 x,由它產生的好數 y,我們可以通過 \(y \bmod 10\) 和 \(x \bmod 11\) 推知 \(y \bmod 11\),這樣就可按 \(\bmod 11\) 建出自動機了。
具體來說,設 \(x\) 排名 u,y 排名 v,有這樣的關系:
在自動機上 dp 即可。
6338. 「SDWC2018 Day2」優秀
\(\Theta(n^5)\) 能在 300 ms 內過 \(n = 100\) 是我妹想到的。
設 \(dp[i][j][k][t]\) 表示前 i 種數放了 j 個,在排列上有 k 個需要插入的位置,排列的方案數是 t 的總方案數。
事實上這就是一個 \(\mathsf{dp \ of \ dp}\),大力轉移,我們放 \(p(p \ge k)\) 個 \(i+1\) 來插入,新的排列需要插入的位置個數就是 \(p - k\) 個,並且方案數就是相當於一個箱子放球問題,用隔板法即可。
方案數那維非常容易不合法,也許是這題可以 \(\Theta(n^5)\) 過的原因。
3069. 「2019 集訓隊互測 Day 1」整點計數
考慮枚舉 dis,那么就是這題 圓上的整點
答案就是 \(\sum_{i=1}^Nf(i)^k\),有經典結論設 \(\chi(n)=\begin{cases}1& n\bmod 4=1\\-1 &n \bmod 4=3\\0 & \text{Ohterwise}\end{cases}\) 那么答案就是 \(4\sum_{d|i^2}\chi(d)\)
容易發現 \(\chi\) 是一個積性函數,\(f\) 並不積性,但是 \(\frac f4\) 是積性函數,設 \(g(x)=\frac{f(x)}4\),\(g(x)\) 在質數上的點值為 \(g(p^c) = \begin{cases}(2c+1)^k & p \bmod 4 = 1\\1 & p \bmod 4 = 3\end{cases}\),接下來就是用 \(\mathbf{min25}\) 解決積性函數求和的問題了。
UOJ426 [集訓隊作業2018]石像
G 是一個積性函數可以使用傳統篩法篩出來,其在 \(p^c\) 的點值是:
F 可以使用拉格朗日插值。
為什么是多項式?我們可以枚舉所有點一共有多少個不同的值,顏色個數為 k 的方案個數是固定的系數,然后從 m 里面選出來 k 種顏色,這個是關於 m 的 k 次多項式。
如何算出顏色個數為 k 的方案呢,我們可以按拓撲序進行轉移,然后進行二項式反演即可(如果開兩個數組滾動應該也行)。拓撲序可以用 tarjan 縮點的時候順便求。
CF1063F String Journey
我觀察到了如下性質:
- 答案是 \(\Theta(\sqrt n)\) 級別的。
- 最后一個串是一個字母,然后每次只會在前端或后端加入一個字母。
應用第一個性質可以得到 \(\Theta(n\sqrt n)\) 的哈希表做法。
應用第二個性質可以得到 \(\Theta(n\log n)\) 的后綴自動機做法,具體來說:
將串翻轉,設 \(dp_i\) 表示以 i 結尾的最大長度是多少,貪心可得不需要考慮長度更小的串。比較厲害的是觀察到 \(dp_{i+1}-1\le dp_i\),所以得到了 \(dp_{i+1}\) 的范圍,我們可以暴力掃,勢能分析一下復雜度是對的,如何 check 一個答案是后綴自動機模板題。
3114. 「SDOI2019」移動金幣
知道結論后就比較簡單了,發現這就是一個階梯博弈,結論是:奇數堆石子異或和為 0 必敗,否則獲勝。
那么我們枚舉奇數堆石子總和,剩下部分使用組合數分配,設 \(dp[n][bit]\) 表示石子的最高位小於等於 bit,總和等於 n 先手必敗的方案數,暴力枚舉轉移即可,時間復雜度 \(\Theta(nm \log n)\)。
PE444
直接不好做,我們需要考慮每個人的決策。
輪到 x 時,他知道已經翻開而且沒有走的數字集合 \(P\) 和沒有出現的數字集合 \(S\)
如果 \(\min S > \max P\),直接翻開自己即可。否則我們證明一定拿走 \(\max P\):
如果 \(\max P > \max S\),顯然直接拿走 P 最優,否則我們有可能拿到比 \(\max P\) 小的,這是不優的,我們拿到比 $\max P $ 大的,后面一定會被換走,結局還是不優的 >_<。被換走可以歸納證明。
通過手玩發現,留下來的數(不是人)一定是后綴最小值,證明也比較好證。
這個東西的期望是 \(\ln n\) 的,可以考慮算每個位置的貢獻,\(E(p)=\sum_{i=1}^n\frac 1i=\ln n+\gamma+\frac 1{2n}\)
python 算一算即可。
P7111 青春有悔
首先總方案數是好求的,先考慮無修改的情況:
不如改求失敗的概率:
\(\ln,\exp\) 再卷一下,單次就可以做到 \(\Theta(n \log n)\) 了。
假設我們算出來這個東西 \(G(x)\),每次相當於要求 \([x^t]\frac{1-x^{c}}{1-x^{a}}G(x)\),不難發現單次可以 \(\Theta(n)\)。
進一步發現求的是 \([x^t]\frac{G(x)}{1-x^a}-[x^{t-c}]\frac{G(x)}{1-x^a}\),\([x^t]\frac{G(x)}{1-x^a}=\sum_{i=0}^{t}[i \equiv t\bmod a][x^i]G(x)\)。
經典問題,根號分治即可。
3115.「SDOI2019」連續子序列
講道理以前沒見過這個序列,這里有一些性質:http://www.matrix67.com/blog/archives/5822
這個序列可以由集合 \(\{0\}\) 以這樣的方式形成:當前集合大小為 \(2^k\),將集合中每個 0 替換成 01,1 替換成 10,形成新的 \(2^{k+1}\) 大小集合。
對應的就可以縮回去,可以證明對於長度大於 3 的字符串有唯一的方法縮:否則就會出現 00 / 11 被划分到一塊的情況。
這樣就可以大力記憶化了。
3102. 「JSOI2019」神經網絡
現在二合一題越來越多了。
我們可以比較簡單的 dp 出將一棵樹划分成 k 條鏈的方案數,注意長度大於 1 的鏈有兩個方向。
第二問是有 T 個顏色,每種顏色有若干有標號小球,將小球排成一個環,任何兩個相鄰小球顏色不同的方案數。
考慮容斥,如果是一個序列,那么對於一種顏色生成函數大概是:
考慮環上的情況,我們強制第一種顏色的一號點所在的鏈放在第一個位置,第一個顏色的 EGF 為:
小問題是第一個顏色可能和最后一個顏色相同,我們減去不合法的情況,這時第一個顏色 EGF 為:
然后暴力卷積即可。
3051. 「十二省聯考 2019」皮配
十二省聯考有 3 道 dp 題 😮
容易設究極暴力 dp,\(f[N][0/1][Ya][Za][R][r]\),稍微優化一下發現 r 這維沒有用,加上滾動數組可以獲得 40 pt。
接下來我們仔細分析一下,每個導師沒有有自己的人數限制,而是和別人一共的人數限制,思考一下發現就是有兩堆數 \(\{c_0,c_1\},\{d_0,d_1\}\),從第一堆里選一個數,再從第二堆里選一個數,都減去自己的權值。如果 \(k = 0\),那么兩堆就是完全獨立的,我們可以先 dp 出第一部分,然后再 dp 出第二部分合並即可,這樣就可以拿到 \(70pt\) 了。
否則我們把有限制的人拿出來單獨 dp 然后最后合並即可。
2435. 「ZJOI2018」迷宮
感覺整個人都自動機了:保齡自動機。
這題本質是求 m 進制 \(k\) 倍數識別自動機的最小節點數。
有一個平凡構造,建立 k 個點,點 i 向 \(i \times m + r \quad(r \in [0,m-1])\) 連邊,不難發現這樣是正確的。
由奇怪定理可知所有 DFA 最簡化都是一樣的,所以我們試圖對這個自動機進行簡化。
暴力算法跑不過的,因為這題有優美的性質。
考慮兩個節點 \(u, v\) 本質相同當且僅當對於任意串 \(s\),從 \(u\) 開始,匹配 \(s\) 到了終止節點,那么 \(v\) 開始也會到終止節點,不難發現第一個條件,兩個節點到達終止節點的最短串大小相同,設其為 t,對於一個串,從 \(u\) 節點開始走,最終會到 \(u\times m^{l+1}+a_l\times m^{l}+\cdots a_0 \bmod k\) 號節點,發現只要 \(u \times m^{l+1}\equiv v\times m^{l+1}\bmod k\) 即可,那么當 \(l+1=\text{最短串長度}\) 時限制最嚴格,有了這兩個限制,我們可以進行模擬了。
3042. 「ZJOI2019」麻將
又是一道自動機題:胡牌自動機。
我們將期望轉化為摸了 k 張牌,不獲勝的概率是多少。
如果給定一種狀態,我們可以用 dp 來判斷其是否胡牌,具體而言:\(dp[0/1][j][k]\) 表示是否摸了對子,i - 1 處開始的順子個數為 j,i 處開始的順子個數為 k 時最多可以摸幾張面子,cnt 表示最多可以配出一個對子,一個未胡狀態就對應着這 18 個 dp 數組的值再加上一個 cnt,看起來很大,但實際上很稀疏,經過搜索,我們發現只有 2000+ 個狀態,這樣就可以快樂 dp 了,轉移時用組合數,注意在值域上從前向后 dp 而不是隨機加入一張牌。
當然也可以使用 DFA 最小化算法進一步縮小 DFA 大小,但這里沒有必要。