Ynoi 做題筆記(2024 年暑假)

huangkxQwQ發表於2024-08-29

P9992 [Ynoi Easy Round 2024] TEST_130

之前大概想出來了,但是沒想清楚。

發現每次詢問 \(w, d\) 就相當於算 \(w\) 子樹裡離 \(w\) 距離不超過 \(d\) 的點的貢獻之和,\(w\) 的貢獻是 \(d + 1\)(因為 \(N(w, 0), N(w, 1), \ldots, N(w, d)\) 都可以),\(w\) 往下第一層的每個點分別的貢獻是 \(d\),第二層每個點分別的貢獻是 \(d - 1\),以此類推。

處理有根樹的子樹資訊,因為有根所以我不會用點分治做這道題,因此考慮 dsu on tree 或者類似的在樹上做啟發式合併的做法,發現直接算不是很好算。如果每個點的貢獻是它到當前子樹根的距離就可以方便地做 dsu on tree 或者類似的東西了,因為這樣單點的貢獻和 \(d\) 無關,而且每次往上移動的時候原來子樹裡面所有點到當前子樹根的距離都會 \(+ 1\),很好維護。

發現容易轉化到上面這種好做的題,相當於對一個詢問總的貢獻就是 \(w\) 子樹裡離 \(w\) 距離不超過 \(d\) 的點的個數 \(\times (d + 1)\),再減去這些點到 \(w\) 的距離之和。

那麼現在有兩個問題:

  1. \(w\) 子樹裡離 \(w\) 距離不超過 \(d\) 的點的個數。
  2. \(w\) 子樹裡離 \(w\) 距離不超過 \(d\) 的點到 \(w\) 的距離之和。

我之前、剛才想得好像有點問題!dsu on tree 做這個好像是雙 log 的,可能可以用平衡樹。那好像還不如直接平衡樹啟發式合併(???)。

然後貌似還可以線段樹合併,應該是單 log 的,但看討論區說常數大。

另外有一個要注意的點,題目有點小瑕疵,給的 d 是可以大於子樹深度的,但 d' 是不能大於子樹深度的,然而資料範圍裡沒有這個限制。[如果用上面的方法好像要注意 d 和子樹深度什麼的取 min。](?)

題解區好像有在 DFS 序上跑掃描線用樹狀陣列維護的方法。還沒仔細看。