1. 程式人生 > 其它 >刷(shui)題記錄 2021.12

刷(shui)題記錄 2021.12

[ABC228-G] Digits on Grid

\(\Rightarrow\)原題連結

可以發現行數和列數相當小,可以將其中一維狀壓,同時因為奇數步和偶數步的操作很類似,只需要考慮其中一種就行了,這裡考慮奇數步。

\(f(S)\) 表示當前位置所在的行的集合為 \(S\) 的方案數,接下來我們需要計算出 \(g(S)\) ,其意義是所在的列的集合為 \(S\) 的方案數,這時候我們從 \(f(S)\) 中找一個數字 \(a\) 拓展,其能到達的行的集合為 \(D(S,a)\) ,那麼可以得到轉移:

\[g(D(S,a))\leftarrow f(S) \]

這個 \(D(S,a)\) 可以使用 \(D(S,a)=\{j\mid i\in S, a_{i,j}=a\}\)

得到。

初始條件顯然是 \(f(\{1,2,3,\dots, h\}) = 1\)

[ABC229-G] Longest Y

\(\Rightarrow\)原題連結

容易想到二分,然後 \(\verb|check|\) 的時候顯然要選擇編號連續的一段,保持中間的不動,然後兩頭往中間靠就行了。

[ABC230-G] GCD Permutation

\(\Rightarrow\)原題連結

可以先寫一下題目要求的式子:

\[\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \left[(i,j)> 1 \land \left(p_i,p_j\right)> 1\right] \]

對於形如 \([n>1]\)

的判斷式,可以使用莫比烏斯函式的性質:\(\sum_{d|n} \tilde\mu(d)=[n>1]\) 展開。注意,這個 \(\tilde\mu(n)=-\mu(n)\) 。由於原題的條件式是 \(\verb|and|\) ,因此可以直接將兩個求和乘起來。

變化一下:

\[\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \sum_{d|(i,j)} \sum_{g|\left(p_i,p_j\right)} \tilde\mu(d) \tilde\mu(g) \]

按照化式子的套路,可以將 \(d,g\) 放到前面去:

\[\mathrm{ANS}= \sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \sum_{i=1}^n \sum_{j=i}^n [d|i~\land~d|j~\land~g|p_i~\land~g|p_j] \]

後面兩個 \(\Sigma\)

可以看成是一個關於 \(d,g\) 的函式,但是因為 \(d,g\)\(i,j\) 的限制其實是一樣的,因此設 \(f(d,g)=\sum_{i=1}^n [d|i~\land~g|p_i]\) ,那麼式子就變成了:

\[\mathrm{ANS}=\sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \frac{f(d,g)[f(d,g)+1]}{2} \]

\(\tilde\mu(n)\ne 0\) 位置不多,將這些位置都找出來。

[ABC225-F] String Cards

\(\Rightarrow\)原題連結

寫了一堆假做法。

首先將字串排序,使其滿足對於任意一組 \(1\leq i < j\leq N\) ,滿足 \(S_i+S_j< S_j+S_i\) 。然後倒著 \(dp\) ,設 \(f(i,j)\) 表示考慮了第 \(i\)\(n\) 個,選擇了 \(j\) 個的最小字串,顯然有轉移:

\[f(i,j)=\min\{f(i+1,j),S_i + f(i+1,j-1)\} \]

[ABC225-G] X

\(\Rightarrow\)原題連結

首先可以轉化一下題意:\(\mathrm{ANS}=\left(\sum_{i,j} A_{i,j}\right)-\text{不選擇的位置}-C\times 橫線數\) 。我們要最小化這兩個減去的數,可以考慮用最小割。

有兩種選擇:

  1. 不選擇這個數。
  2. 選擇這個數,嘗試和左上角和右上角連線起來,對於其中一個方向,如果不能連線,就加上 \(C\)

對於第一種選擇,可以這樣搞:

\[\forall ~1\leq i\leq H, 1\leq j\leq W,~S\xrightarrow{A_{i,j}} (i,j) \]

對於第二種,以左上為例:

\[\begin{aligned} \forall~ 1\leq j\leq W, ~&(1,i)\xrightarrow{C} T\\ \forall~ 1<i\leq H, 1\leq j\leq W, ~&(i,j)\xrightarrow{0} T, (i,j)\xrightarrow{C} (i-1,j-1) \end{aligned} \]

[USACO21OPEN] Balanced Subsets P

\(\Rightarrow\)原題連結

容易想到一個 \(O(n^5)\)\(\verb|dp|\) 。設 \(f(i,l,r,0/1, 0/1)\) 表示當前考慮到第 \(i\) 行,第 \(i\) 行選擇了區間 \([l,r]\) ,第 \(i\) 行的左端點為遞減/遞增狀態,右端點為遞增/遞減狀態的方案數,轉移顯然。可以發現可以用二維字首和優化成 \(O(n^3)\) 。程式碼非常令人煩躁。

[CF-1366F] Jog Around The Graph

\(\Rightarrow \rm luogu\) 連結

分情況討論。

對於路徑長度小於等於 \(m\) 的,可以使用 \(\verb|dp|\) 求出答案:設 \(f(i,j)\) 表示走了 \(i\) 步,到達節點 \(j\) 的最長長度,轉移顯然,這裡令不能到達的 \(f(i,j)=-\infty\)

對於路徑長度大於等於 \(m\) 的答案,設長度為 \(l\),這時候路徑一定不是簡單路徑。思考一下性質可以發現,答案的方案一定是走到某一邊的一端之後,剩餘都是在這條邊上來回走動,換而言之,答案一定是形如 \(w_e(l-m)+f(m,u_e/v_e)\) 的。這個東西很明顯是一個直線的形式,但是由於座標範圍過大,不能用李超樹。將其轉化為維護凸包的一半,然後對於凸包上的每一個點都求出貢獻。

[CF-1366G] Construct the String

\(\Rightarrow \rm luogu\) 連結

容易想到用 \(\verb|dp|\) 解決,設 \(f(i,j)\) 表示用 \(s_{1\dots i}\) 匹配 \(t_{1\dots j}\) 的最小花費。關鍵在轉移,容易想到刪除和匹配一個字元的轉移,但是原串中的 \(\verb|'.'|\) 帶來的撤回操作並不是那麼好處理。但是我們可以將撤回操作和被撤回字元一起處理。具體而言,對於一個位置 \(i\) ,若下一個位置是一個小寫字元,其被撤回的操作顯然是滿足 \(\sum_{j=i}^k |s_j = \verb|'.'||=\sum_{j=i}^k \left|s_j \in [\verb|'a'|, \verb|'z'|]\right|\) 的第一個 \(k\) ,設其為 \(\mathrm{nxt}_i\)

那麼可以得到轉移:

\[\begin{aligned} f(i+1,j+1) &\xleftarrow{s_{i+1}=t_{j+1}} f(i,j)\\ f(i+1,j) &\xleftarrow{} f(i,j)+1\\ f(\mathrm{nxt}_{i+1}, j) &\xleftarrow{ s_{i+1} \in [\verb|'a'|, \verb|'z'|]} f(i,j) \end{aligned} \]

答案顯然為 \(f(|s|,|t|)\)