Codeforces 1149 题解
A
特判全是 \(2\),對于有 \(1\) 的情況把 \(1\) 放到第二個和最后。
時間復雜度 \(O(n)\).
代碼: 76492031
B
考慮只有一次詢問的情況,有一個 \(O(n^3)\) 的 DP,設 \(f[i][j][k]\) 表示三個串分別匹配到 \(i,j,k\),大串最短匹配到哪。轉移形如 \((i,j,k)\rightarrow (i+1,j,k),(i,j+1,k),(i,j,k+1)\).
有修改相當于給某一維 \(+1\) 或 \(-1\),顯然影響到的 \((i,j,k)\) 只有 \(O(L^2)\) 個,直接改即可。(\(L\) 為 \(A,B,C\) 串長度)
時間復雜度 \(O(n|\Sigma|+qL^2)\).
代碼: 76579067
C
顯然問題就相當于選擇三個數 \(i,j,k\) 滿足 \(0\le i\le j\le k\le n\),最大化 \(s_i-2s_j+s_k\) (\(s\) 為前綴和),修改的形式為區間加或減 \(2\).
線段樹經典題。直接線段樹維護 \(s_i\), \(-s_j\), \(s_i-2s_j\), \(-2s_j+s_k\), \(s_i-2s_j+s_k\) 的 \(\max\) 即可。
時間復雜度 \(O(n+q\log n)\).
代碼: 76672305
D
由于邊權只有兩種,我們需要考察的狀態顯然是僅加入 \(a\) 邊之后的連通狀態。
考慮一條從 \(1\) 到 \(p\) 的路徑,為了滿足最小生成樹的限制,我們僅僅需要滿足路徑上不出現“從某個連通塊出來又重新進去”這種事情。
有一個顯然的狀壓 DP,設 \(f[s][u]\) 表示經過的連通塊集合為 \(s\),現在處于點 \(u\). 其實嚴格來講這是一張圖,需要在上面跑最短路(因為需要處理 \(s\) 相同 \(u\) 在同一連通塊內的轉移)。
問題是連通塊個數太多了。一個很自然的想法是大小為 \(1\) 的連通塊可以用一些手段縮去,但這還不夠。事實上,大小不超過 \(3\) 的連通塊都是不需要記錄進 \(s\) 中的。因為如果從這個連通塊里出去再回來至少要花費 \(2b\) 的代價,而這個連通塊內任何兩點的距離不超過 \(2a\).
因此 \(s\) 只需要記錄大小 \(\ge 4\) 的連通塊是否經過過的狀態。這樣的連通塊最多只有 \(\frac{n}{4}\) 個。
時間復雜度 \(O(2^{\frac{n}{4}}m)\).
代碼: 76698798
E
結論:設 \(f(u)=\text{mex}_{v\in out[u]}f(v)\),則可以把每個點表示為 \(a_k\omega^{f_k}\),就相當于一個只有第 \(f_k\) 個位置為 \(a_i\) 其余都為 \(0\) 的數組(這里的 \(\omega\) 在博弈論里還有一些其他的神奇意義),則先手勝當且僅當對于每個位置,所有的點的異或和均為 \(0\) (即 \(\forall i,\bigoplus_{f[u]=i}=0\)).
證明詳見官方題解。
代碼: 76707873
總結
以上是生活随笔為你收集整理的Codeforces 1149 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 1025 题解
- 下一篇: Codeforces 1336E Chi