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

刷(shui)題記錄2022.4

[ABC247-F] Cards

\(\Rightarrow \rm AT\) 連結

轉化問題,將每一張牌看成一條邊 \((P_i,Q_i)\) ,問題就轉化成若干個環的答案積,每一個環的答案都是選擇若干邊,使得所有點都至少存在一條邊被選擇的方案。考慮斷環為鏈,可以發現可以用 \(\rm dp\) 解決,設 \(f_x(n,0/1)\) 表示預設第一個點是否選擇 \(x\in \{0,1\}\) ,考慮了前 \(i\) 個點,其中第 \(n\) 個點是否已經被覆蓋的方案數,轉移顯然。那麼一個大小為 \(n\) 的答案是 \(f_0(n,1)+f_1(n,0)+f_1(n,1)\)

[CF1601-C] Optimal Insertion

\(\Rightarrow \rm luogu\) 連結

\(b\) 從小到大排序,這時 \(b_i\) 插入位置設為 \(p_i\) 表示插入到 \(a\) 的第 \(p_i\) 個數和第 \(p_i+1\) 個數之間。那麼有 \(p\) 單調不降。證明可以考慮排序之後交換 \(b\) 中的兩個數,可以發現答案一定會變劣。

考慮分治,用函式 \(\mathrm{solve}(l_a,r_a,l_b,r_b)\) 計算 \(b_{l_b\dots r_b}\) 的位置,位置可以為 \(a_{l_a\dots r_a}\) 中任何一個。設 \(m = \left\lfloor\frac{l_b+r_b}{2}\right\rfloor\)

,容易想到用若干個迴圈計算出 \(p_m\) 。然後分治計算 \(\mathrm{solve}(l_a, p_m, l_b, {m-1}), \mathrm{solve}(p_m, r_a, m+1, r_b)\) 。是計算複雜度是 \(O((n+m)\log_2(n+m))\)

最後計算一遍逆序對。

[CF1039-D] You Are Given a Tree

\(\Rightarrow \rm luogu\) 連結

考慮對於單個 \(k\) ,可以使用樹上貪心求出。同時可以發現隨著 \(k\) 增加,答案一定是單調不升的,因此可以使用類似上一題的分治進行求解。

[CF1658-F] Juju and Binary String

\(\Rightarrow \rm luogu\) 連結

將原陣列複製一份連到末尾變成 \(S'\),這時候有一個結論,有解當且僅當存在一個 \(S'\) 中的長度為 \(m\) 的子串的 \(\rm cuteness\) 等於原串的 \(\rm cuteness\) 。(有點神奇)

考慮滑動視窗,每向右移動一格,子串(視窗)中 \(\texttt{1}\) 的個數變化只能是 \(\pm 1\) ,假如合法的子串需要的 \(\texttt{1}\) 的個數為 \(g\) ,那麼假設存在兩個子串,其 \(\texttt{1}\) 的個數分別 \(<g\)\(>g\) ,那麼這兩個子串之間一定存在一個合法的區間。顯然不存在都是 \(<g\) 或者 \(>g\) 的情況。

[CF1270-F] Awesome Substrings

\(\Rightarrow \rm luogu\) 連結

考慮列舉一個整數 \(k\) ,然後求出 \(k(c_r-c_l)=r-l\Leftrightarrow r-kc_r=l-kc_l\) 的區間 \((l,r]\) 個數。

然後根號分治。

對於 \(k\leq \sqrt{n}\) ,這時候直接暴力列舉 \(k\) 統計就行了。

對於 \(k\ge \sqrt{n}\) ,這時候 \(c_r-c_l=\frac{r-l}{k}\leq \sqrt{n}\) ,因此對於每一個合法區間, \(\texttt{1}\) 的個數都不多,這時候列舉 \(l\) ,然後列舉 \(k\) ,可以合法的 \(r\) 的範圍,