11.4 - ? 改題紀要
NOIP2024模擬1
不是每個題都有亂搞過得是吧。
-
T1 玩遊戲
先字首和,問題變成 \(a_i+b_j\le0\)
考慮顯然貪心,每次移動到更優的位置。
這樣可以跳到最小的位置,發現到終點和從起點跳過來是類似的,倒著跑一遍即可。
-
T2 排列
首先發現當 \(k>\log n\) 時一定無解 因為顯然每次最少消掉一半。
考慮 dp。
發現對於最大值可以將陣列分成不相干的兩部分,考慮直接在笛卡爾樹上跑。
除了要特判的根,對於一個子樹,其只有兩種可能:有一邊有最大值和兩邊都有最大值。設 \(dp_{i,j,0/1}\) 表示大小為 \(i\),總共 \(j\) 步消完,\(0/1\) 表示不同種子樹。
轉移挺顯然,暴力整是 \(n^2\log^2n\) 的,加上巴雷特約減輕鬆過,字首和最佳化一下可以做到 \(n^2\log n\) 的。
-
T3 最短路
好題。
首先那個二維 dij 是假的了。
考慮最後走的路線一定是一些環接起來,順逆時針依次顛倒。環的交就是重合的點。
設 \(dp_{i,j}\) 表示 \(1\to i\to j\to 1\) 的最短距離,類似 dij 暴力列舉其後面兩個 \(i',j'\) 可以做到 \(n^4\log n\)。
發現的轉移貢獻 \(j\to i'\to j' \to i\) 中 \(i'\to j' \to i\) 和 \(j\) 沒有關係,可以設定一箇中轉狀態 \(f_{i,j}\) 表示 \(dp_{i,k_1}\to dp{j,k_2}\) 中只計算了 \(k_1\to j\) 的貢獻的值,這個顯然可以在 \(dp_{i,k_1}\) 時列舉 \(j\) 轉移,然後用 \(f_{i,j}\) 列舉 \(k_2\) 轉移 \(dp_{j,k_2}\) 即可做到優秀的 \(n^3\log n\) 複雜度。
因為值域較小,可以用桶代替堆,做到 \(n^3\),但是 \(n^3\log n\) 已經可以透過。
-
T4 矩形
起手掃描線。
考慮線段樹維護加線段和減線段,加線段時直接維護線段覆蓋次數,並將覆蓋的所有顏色推平,可以用並查集維護;減線段時打標記,當加線段時發現這段區間已經被減成 \(0\) 了就新染顏色。
發現只有加線段會新加常數個顏色段,一個顏色段只會貢獻一次,複雜度顯然。