Duel 記錄

Lcyanstars發表於2024-12-10

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)\) 的.