11.9刷題總結

Varuxn發表於2021-11-09

CF1422F Boring Queries

OMA 推薦的好題,挺早之前就想要做了,昨天晚上看了看題解,今早上(7:26) 就過了。。

對於最小公倍數可能想的就是維護區間乘積以及 GCD ,然而這是不對的,反例也很好出來 2,2,4

然後就有了第二個錯誤的做法,先求出來兩個數字的 LCM 然後對於新加入的數字再求一遍,顯然是不對的,因為取模破壞掉了某些本來存在的因數。。

有根號分治的做法,但是不會,於是學習了主席樹做法。

先考慮離線做法,對於固定的右端點,從右往左掃左端點,一個數字的質因數的若干次冪 \(p^k\) 如果之前出現過 \(p^i\) ,那麼只有在 \(k>i\) 的時候 LCM 才會多出來 \(p^{k-i}\) 的貢獻。

再想一想線上我們可以對於每一個右端點開一個主席樹,然後貢獻就是按照上面所說的去做,對於左端點多餘的貢獻直接記錄 \(p^i\) 上一次出現的位置,然後單點修改就好了。

查詢直接區間查詢。。(code)

P7925 「EVOI-RD2」童年

這個就是不知道啥時候在 Luogu 某次比賽上面找到的題了,沒啥演算法,但是感覺不錯。

\(f_i\) 表示遍歷 \(i\) 的子樹需要的最少的蘋果數,對於一個根節點,可以用優先佇列優先進入一個需求少的子樹,然後不斷更新答案。

最後同樣 BFS 一遍利用 f 陣列,也是優先佇列貪心的選擇花費較小的節點遍歷。(code)

P2685 [TJOI2012]橋

同樣是 OMA 推薦的題目,線段樹+最短路。

顯然的,Boss 一定會在 1 到 n 的最短路上面,那麼我們先跑出來 1 以及 n 的單源最短路,同時記錄前驅,這樣我們就可以挨個跳回去找到 1 到 n 的最短路上的點了。

然後利用最短路徑上的點更新其他點的 \(1\rightarrow n\)\(1\rightarrow x\) 最短路徑上最遠的重合的點以及 \(n\rightarrow 1\)\(n\rightarrow x\) 最短路徑上最遠的重合的點,分別記為 \(l_i,r_i\)

對於一條邊 \((u,v)\) 可能處於最短路徑上的情況當且僅當 \([l_u,r_v]\) 上面的邊斷掉,那麼我們直接給這個區間的可能值與 \(dis1_u+val_{(u,v)}+disn_v\) 取較大值最後統計答案。(code)

P4492 [HAOI2018]蘋果樹

不知道在任清單裡面放了多少年的一個計數題了。

第一思路肯定是統計條邊可能的貢獻,以 i 為根節點子樹大小為 j 的貢獻就是 \(方案數\times j\times(n-j)\)

問題就變成了求方案數,我們可以把方案數分為三部分:

  • 編號在 i 之前的:由於是一顆二叉樹,因此方案數就是 \(i!\)

  • 在 i 子樹中的:首先是選擇編號也就是 \(\binom{n-i}{j-1}\) 然後排布的方案數也類似與上面就是 \(j!\) 總體方案數就是 \(\binom{n-i}{j-1}\times (j!)\)

  • 編號在 i 之後但是不在 i 的子樹中的: 再新加入一個點的方案數為 \(i−1\),加入第二點的方案數為 \(i\),加入第二點的方案數為 \(i+1\) ,一直加到最後一個點,總方案數就是 \(\dfrac{(n-j-1)!}{(i-2)!}\)

答案的柿子就是:

\[\displaystyle\sum_{i=1}^n\sum_{j=1}^{n-i+1}j\times(n-j)\times j!\times\binom{n-i}{j-1}\times(n-j-1)!\times i\times (i-1) \]

直接 \(n^2\) 推即可。(code)

CF1575M Managing Telephone Poles

這個就是題單上面的題目了,是個斜率優化,直接四個方向分別做一邊就好了。

\(las_k\) 表示前 \(i\) 行,第 \(k\) 列最下面的點的橫座標。

\(S(i,j)=\min\limits_{0\le k\le m}\{k^2-2jk+j^2+(las_k-i)^2\}\)

那麼我們想要截距儘量的小,維護一個下凸包 \(x\) 軸是 \(k\)\(y\) 軸是 \(k^2+(las_k-i)^2\) ,直接單調佇列斜率優化。(code)

CF1572C Paint

首先發現所有連續的顏色相同的可以縮為一個點。

一個比較妙的 DP 定義方式 \(f_{i,j}\) 表示最終顏色為 \(s_j\) 的最小運算元,如果改變顏色答案不會更優。

顯然可以由 \(\min\{f_{i+1,j},f_{i,j-1}\}+1\) 轉移過來。

也可以與右端點顏色相同的地方轉移過來也就是 \(f_{i,pre_j}+f_{pre_j+1,j}\) 轉移。

由於同一顏色最多有 20 個因此複雜度允許。(code)

CF258D Little Elephant and Broken Sorting

AT4513 [AGC030D] Inversion Sum

這倆其實是一個題 (雙倍經驗??)

直接一點的狀態定義方式 \(f_{i,j}\) 表示 \(i\)\(j\) 大的概率。

對於一次交換 \((x,y)\) 直接轉移:

\[f_{i,x}=f_{i,y}=\dfrac{f_{i,x}+f_{i,y}}{2} \]

\[f_{x,i}=f_{y,i}=\dfrac{f_{x,i}+f_{i,y}}{2} \]

對於 \(i=x\) 或者 \(i=y\) 的情況特殊轉移即可。(code(CF258D))

AT2672 [AGC018C] Coins

反悔貪心,設 \(e_i=b_i-a_i,f_i=c_i-a_i\) ,一開始都選擇金幣。

對於 \((e_i,f_i),(e_j,f_j)\), 假設 i 選 f 且 j 選 e ,考慮什麼時候交換他們的選擇收益不會變少,也就是 \(e_i + f_j \geq e_j + f_i\)

於是可以根據 \(e_i-f_i\) 從大到小進行排序,這樣就可以保證有一個決策點是最有的並且銀幣都在他前邊,銅幣都在他後面。

於是可以通過優先佇列處理字首選 \(y\) 個,字尾選 \(z\) 個的貢獻,列舉分割點統計答案。(code)

CF325E The Red Button

一個非常好的構造題,顯然的是奇數一定沒有解。

然後發現 \(i\)\(i+\dfrac{n}{2}\) 其實是等價的,那麼他倆選擇的一定是不同的走法,那麼先預設 \(i\)\(2i \bmod n\)\(i+\dfrac{n}{2}\)\((2i+1) \bmod n\)

並茶几維護,如果兩個所在環不是同一個,那就交換兩個的決策使得兩個環合併起來。(code)

CF1572E Polygon

二分+區間 DP check

貌似讀入需要逆時針排序,但是由於出題人良心就不需要啦~~~(code)

相關文章