測試題目選集
暫無。
Miscellaneous
[清華集訓2016] Alice 和 Bob 又在玩遊戲
考慮計運算元樹作為一個有向圖遊戲時的 SG 函式值。根據 SG 函式的定義,應該有:
感覺有點棘手,不妨做一步簡單的轉化:
然後就是每個點初始集合中有一個 \(s(i)\),同時從下往上將 \(u\) 的所有兒子的集合內的值異或上 \(s(u)\) 後加入 \(u\) 的集合中,同時 \(SG(u)\) 應該等於此時這個集合的 \(\mathrm{mex}\)。這個可以使用一些資料結構簡單做到 \(O(n\log_2^2 n)\),比如啟發式合併。不過更符合異或思路的應該是時間複雜度 \(O(n\log_2 n)\) 的 01trie 合併。
Submission #799025 - QOJ.ac
[BZOJ2121] 字串游戲
考慮實際上應該是求出 \(f(l,r)\) 表示是否可以只刪掉 \([l,r]\) 中的所有字元就可以求出答案。
隨便搓一下,可以得到一個 \(O(|L|^4\sum |p|)\) 的區間 dp,但是考慮似乎計算區間內的刪除關係對於每個 \((l,r)\) 單獨計算有點奢侈了。
考慮記 \(g(l,r,i,j)\) 表示 \([l,r]\) 刪成只剩第 \(i\) 個字串的前 \(j\) 個字元。
發現 \(g(l,r,i,j)\leftarrow g(l,r-1,i,j-1)\) 或 \(g(l,r,i,j)\leftarrow g(l,k,i,j) | f(k+1,r)\)。而且 \(f(l,r)\leftarrow g(l,r,i,|p_i|)\),於是可以得到一個 \(O(n^3\sum |p|)\) 的做法。
提交記錄 #2737108 - Becoder
[SDOI2010] Auction 程式碼拍賣會
記 \(f(x)=(f(x-1)\times10+1)\mod p\)。考慮這個題目要求的充要條件就是選出一個大小小於等於 \(8\) 的可重集 \(s\),使得:
因為 \(p\) 很小所以可以揹包解決,時間複雜度 \(O(|\Sigma|^3p^2)\),其中 \(|\Sigma|\) 為可重集最大大小,為 \(8\),因此可以透過此題。
提交記錄 #2737458 - Becoder
[AGC018C] Coins
考慮只有三種硬幣,因此應該具有特殊性。考慮只有兩種時怎麼做。簡單的做法是先所有都取 \(a_i\),然後選 \(b_i-a_i\) 最大的幾個變成取 \(b_i\)。另外還有一種思考,就是對於 \(i,j\) 而言,如果兩個中只有一個是 \(a_i\),那麼如果 \(a_i+b_j\) 更優的話,那麼就有 \(a_i+b_j\ge a_j+b_i\),即 \(a_i-b_i\ge a_j-b_j\)。那麼這個是有傳遞性的,所以可以按照 \(a_i-b_i\) 排序後前 \(x\) 個選 \(a\),後 \(y\) 個選 \(b\)。
將兩者均運用在此題上,發現可以先全部選 \(a_i\),然後讓 \(b_i\leftarrow b_i-a_i,c_i\leftarrow c_i-a_i\)。然後就是選 \(y+z\) 個位置,其中 \(y\) 個給答案貢獻 \(b_i\),\(z\) 個給答案貢獻 \(c_i\)。然後可以運用到第二種思考,考慮 \(b_i+c_j\ge b_j+c_i\) 時應該有 \(b_i-c_i\ge b_j-c_j\),於是排序之後找到斷點使得前面選 \(y\) 個 \(b\) 和後面選 \(z\) 個 \(c\) 的總和最大。這個可以用優先佇列預處理。
總的時間複雜度是 \(O((x+y+z)\log_2(x+y+z))\)。
Submission #60424071 - AtCoder Grand Contest 018