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)!}\)
答案的柿子就是:
直接 \(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)\) 直接轉移:
對於 \(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)