【題解】CF2031
yeyou26發表於2024-11-24
A
- tag:簽到題
- 注意到定住一個值後,左邊的值全都得改,右邊的值也全都得改
- 注意到,定住的越多,需要改的就越少
- 所以開桶記一下哪個值最多就行
B
- tag:詐騙詐騙簽到題
- 讀完題容易產生 naive 結論:當且僅當錯位的兩個地方相鄰可以修復,其餘情況全部無法修復
- 感覺真不了一點,於是找三個數 ABC 來手模一下
- 發現這個結論好像是真的,交一發
- 過了,那就真了吧
C
- tag:究極神迷構造題
- 注意到如果是偶數直接 11 22 33 44 55 66 就好了
- 接下來討論奇數
- 注意如果是奇數,必然至少存在一個數出現了奇數次
- 所以必然存在三個點 \(A,B,C\) 使得 \(|AB|^2+|BC|^2=|AC|^2\)
- 注意到最小的滿足 \(a^2+b^2=c^2\) 的正整數三元組是 \((3,4,5)\)
- 考慮如何構造:
- 1 10 26 放一個數
- 23 27 放一個數
- 24 25 放一個數
- 其餘地方兩兩一組放即可
- 顯然小於 27 的奇數無解
D
Sol 1 並查集
- 首先注意到正著跳和反著跳是互逆的,所以我們可以看成只有正或只有反,然後連無向邊
- 考慮並查集
- 顯然,對於每個 \(i\) 都需要向它前面的比它高的點連邊,時間複雜度 \(O(n^2)\),不可接受
- 考慮最佳化
- 用一個 pq 維護 \(i\) 之前比 \(i\) 還高的點,鍵是高度,連一個 pop 一個,並查集同時維護最高高度,離開 \(i\) 時將 \(i\) 和 \(i\) 能到達的最高高度壓入 pq 即可
- 顯然對於每個 \(i\),最多進出 pq 一次,所以複雜度 \(O(n\log n)\)
Sol 2 Clever 做法
- 注意到從一個點開始可能先往後再往前,順序處理比較麻煩。
- 我們考慮最開始可以較為簡單求出答案的點,容易發現 \(a_i\) 最大的點往後的點肯定跳到這個點上。
- 於是每次求出答案未確定的點中 \(a_i\) 最大的點。如果它能跳到 \(j\) 且 \(j\) 的答案已求出,答案 \(ans_i=ans_j\) (我們是從大往小列舉,先求出的答案肯定大)。 再讓它後面所有沒求出答案的 \(j\) 答案為 \(ans_i\) 。
- 非常優美,時間複雜度 \(O(n)\)
E
- tag:好題
- 根據直覺考慮樹形 dp
- \(f_{u}\) 表示子樹 \(u\) 可滿足同構所需最小完美二叉樹深度
- 考慮轉移:
- 考慮沒有兒子:由於這道題的深度是 0-index,直接返回即可
- 考慮只有一個兒子:\(f_{u}=f_{v}+1\)
- 考慮有兩個兒子:\(f_{u}=\max(f_{v})+1\)
- 考慮有好多好多兒子:顯然必須逐個合併,考慮合併順序
- 答案即為 \(f_{1}\)