最近做的一些題目 (2022.9~2022.10)

馬上要 CSP 了, 急了急了.

對 luogu 題目難度的評價: 綠>藍

1. P3147 262144 P

奇怪的 dp 題.
考慮定義狀態 \(f(i,k)\) 表示, 從位置 \(i\) 開始能合併出數 \(k\) 的區間爲 \([i,f(i,k))\).

容易發現 \(f(i,k)=f(f(i,k-1),k-1)\), 轉移複雜度 \(O(n\log n)\).

2. P1712 區間

首先離散化並按照原來的區間長度排個序, 然後尺取即可.
判斷是否合法就是區間加區間 \(\text{max}\).

3. P6033 合併果子 加強版

我們需要 \(O(n)\).
首先桶排, 然後還是做取出最小值, 合併, 插入的操作.
然後你注意到每次取出的最小值單調遞增 (顯然), 於是實際上不需要優先隊列, 直接將合併的結果扔到另一個隊列裏就行了. 每次就是從兩個單調遞增的隊列中選兩個最小值合併.

4. P1333 選擇客棧

亂寫的 \(O(nk)\) 做法.
大概就是把原來內層的暴力枚舉改成了二分+ST表.
優秀的 \(O(n)\) 做法先咕着.

5. P5278 算術天才與等差數列

大數據結構, 我寫法醜陋寫了 \(5.31\text{KB}\) (悲

一個區間重排後可以形成等差數列等價於:

  • \(\max-\min=(r-l)k\);
  • \(\gcd_{i=l}^{r-1} (a_{i+1}-a_{i})=k\);
  • 無重複元素.

前面兩條線段樹隨手維護.
最後一條就比較毒瘤了, 對於每個位置 \(p\), 我們考慮求出使得 \(a_x=a_p\) 的最大的 \(x(x<p)\). 然後就變成了區間 \(\max\).
\(x\) 考慮 map 套 set, 將數列中的值映射成位置的集合, 然後查前驅後繼就行了.

具體實現一車細節, 包括區間長度爲 \(1\), \(k=0\), set 查前驅後繼的邊界.

6. P2127 序列排序

發現置換構成了一些環, 並查集維護環, 分環內最小值環外最小值兩種情況討論即可.

7. CF676C Vasya and String

尺取秒了.

8. CF911D Inversion Counting

結論題. 發現奇偶變化只和翻轉區間的長度有關.

9. AGC008B Contiguous Repainting

顯然通過操作我們會讓一段長爲 \(K\) 的區間顏色相同, 而其他位置的顏色可以做到任意確定.
於是這就變成了前綴和好題(

10. AGC006D Median Pyramid Hard

二分塔頂, 注意到連續兩個同時大於/小於等於當前數的就會一路推上去.
於是塔頂與當前二分的數的相對大小就是離中間最近的那一對與當前二分的數的相對大小.
記得特判沒有兩個相鄰數的相對大小相同的情況.

11. AGC020C Median Sum

注意到能組成的和有對稱性. (若 \(x\) 能組成, \(sum-x\) 也能組成)
bitset, 每加一個數就 \(f|=f<<x\), 就把所有可能湊出來的數都涵蓋了.
從中間開始枚舉, 做完了.

12. ABC107D Median of Medians

和 AGC006D 相似, 我們二分中位數並對數列中的數賦值 1/-1.
然後你發現問題神奇地變成了求區間和非負的區間數量.
做一遍前綴和, 二維偏序即可.

13. ARC075E Meaningful Mean

隨便化一化式子發現又變成了二維偏序.

14. CF475D CGCDSSQ

不同 \(\gcd\) 的個數是 \(n\log n\) 級別的.
具體操作的時候固定左端點, 右端點每次二分+ST表就能求出 \(\gcd\) 變化的位置.

15. P5663 加工零件

容易發現只需求出各個點的長度爲奇數/偶數的最短路.
個人認爲最好想的是分層圖, 一層奇一層偶, 兩層之間連邊跑最短路即可.

16. P5687 網格圖

Kruskal 思想, 要避免成環, 每行/列當前能用的邊數能直接用已經選的列/行數量算出來.

17. P5658 括號樹

首先寫一個可撤銷棧求出來右括號位置 \(u\) 對應的左括號的位置 \(last(u)\) (之前沒寫過這玩意, 差點被送走了)
\(f(u)\) 爲以 \(u\) 結尾的合法串數量, 顯然 \(f(u)=f(fa(last(u)))+1\). 最後從上往下做一個求和就行了.

18. P7915 迴文

詐 騙 題.
考慮將回文的 \(b\) 還原成 \(a\) 你就會明白怎麼做.

19. P1155 雙棧排序

一個序列可以被單棧排序當且僅當沒有 231 型子序列.
於是每出現一組 231, 2 和 3 就不能放到一個棧中.
連邊黑白染色即能判斷是否有解.
得出方案模擬爲了保證優先級又是一車細節.

20. P1613 跑路

Floyd+倍增, 核心就一行:

f[i][j][k]|=f[i][x][k-1]&f[x][j][k-1];

21. CF875F Royal Questions

左部圖點的度數都爲 \(2\) 的二分圖最大匹配.
考慮神奇建邊, 每次將連接的兩個右部圖的點連起來.
然後你發現合法方案就是給邊定向使每個點的入度小於等於 \(1\).
於是合法的邊最多就是 \(n\) 條, 一棵基環外向樹.
於是只需跑最大基環生成森林, 對 Kruskal 稍加改動即可.

22. CF571B Minimization

首先發現這將 A 分成了若干組, 每組取到最大值當且僅當是順序/逆序的.
於是取到最小值的方案只能是將 A 排序後, 從前往後劃分成若干段.
注意到組只有兩種可能長度, 我們用使用兩種長度的個數設狀態隨便 dp 一下就行了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章