【題解】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

  • tag:好題

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\)
    • 考慮有好多好多兒子:顯然必須逐個合併,考慮合併順序
      • 顯然先合小的更優,於是每個點開 pq 即可
  • 答案即為 \(f_{1}\)