CP Duels
· CF204C Little Elephant and Furik and Rubik
容易求出總的匹配對數,即 \(\sum\limits_{i=1}^ni^2\),要求期望只要求 \(\sum f(x,y)\).
考慮每對匹配的字元對 \(\sum f(x,y)\) 的貢獻.
因為一對匹配的字元在字串中的相對位置不變,所以它的貢獻就是能同時延伸到的字串個數.
不妨設第一個字元的位置為 \(i\),第二個字元的位置為 \(j>i\),那麼貢獻就是 \(i\times(n-j+1)\).
由於字符集大小 \(\Sigma\) 很小,可以列舉 \(\Sigma\) 的字元和第一個字元的位置,動態維護第二個字元的位置的字首和與字尾和.
- CF2B The least round way
最小化字尾 \(0\) 個數也就是最小化路徑上數的 \(2\) 和 \(5\) 的次數.
考慮分別記錄 \(2\) 和 \(5\) 的最小次數,較小值即為字尾 \(0\) 的最小個數.
需要特判 \(0\) 存在的情況.
- CF1254B1 Send Boxes to Alice (Easy Version)
只要考慮非零的 \(a_i\) 為同一質因數的情況.
最小距離就是每段與中位數的距離.
+ CF251C Number Transformation
注意到 \(\mathop{\operatorname{lcm}}\limits_{i=2}^{15} \ i = 360360\) 很小,這意味著可以將數軸劃分為長度為 \(\operatorname{lcm}\) 的段,不同段相同位置的行為是相同的.
並且可以發現在同一個段中操作最終總是到 \(\operatorname{lcm}\) 的倍數.
於是可以在段內 dp 跳過前面的段,最後一段 bfs 即可.
· CF1930C Lexicographically Largest
每個 \(a_i\) 能貢獻的最大數就是 \(a_i+i\). 考慮證明如果兩個數貢獻的數相同,一定有一個能減 \(1\) 而其它數不受影響.
對於每一個位置 \(i\),其要減的數可以不超過 \(i\),那麼必然可以以一定的順序透過先操作前面的數得到要減的個數.
+ CF1036C Classy Numbers
令 \(f(x,d)\) 表示 \(0\sim x\) 中含義不超過 \(d\) 個非零數字的數的個數.
設 \(B=\lfloor\lg x\rfloor\),那麼 \(f(x,d)=f(10^B-1,d)+(\lfloor\frac{x}{10^B}\rfloor-1) f(10^B-1,d-1)+f(x\bmod 10^B,d-1)\).
其中 \(f(10^B-1,d)=\sum\limits_{i=0}^d\binom{B}{i}9^i\).
\(f(r,3)-f(l-1,3)\) 即為所求.
· CF360B Levko and Array
二分答案 \(x\).
令 \(dp_i\) 表示 \(a_i\) 不改變,前面的數使得答案成立最少需要改變多少次.
轉移考慮距離 \(i\) 最近的不改變的位置 \(j\).
那麼 \(i\sim j\) 間的所有數都可以改變,使答案成立當且僅當 \(|a_i-a_j|\leq (i-j)x\).
+ CF1887B Time Travel
列舉時刻 \(i\),我們只要知道有多少點可以在時刻 \(i\) 第一次被訪問到並把它加到訪問到的點的集合裡.
因為一條邊只會貢獻一個點,所以可以嘗試列舉邊加點.
如果邊中兩點都沒被訪問到,那麼就會被重複考慮,所以每當新點被訪問,我們再加入點對應的邊即可.
這樣所有邊都只會被考慮到一次,使用 std::unordered_map
複雜度是 \(O(k+\sum m_i)\) 的.