1. 程式人生 > 其它 >CTS 2022 部分題解

CTS 2022 部分題解

5個lxl題已經公佈,笑死。

Day2

A. 燃燒的吶球

複雜問題貌似 boruvka 嚴格比剩下倆厲害,因為所屬關係每輪固定!

考慮 boruvka,相當於每次對於每個顏色,要找異色最小邊。

如果 \(x, y\) 中至少有一個不呈祖先關係是平凡的,可以列舉另一邊,在樹上 dfs 做到 \(O(n)\),這樣有可能數到祖先關係但預設成加法了,但沒關係,因為 - 更小,會在數祖先關係的時候更新掉。

只需處理兩個都呈祖先關係情況:

  • 當前兩個都是祖先,線段樹(單點修改,區間查詢)合併,\(O(m \log n)\)
  • 當前一個祖先,一個兒子,按祖先維線段樹(區間 \(\text{chkMin}\)
    ,單點查詢)合併,\(O(m \log n)\)
  • 兩個都是兒子,一個較劣但能接受的方法是,樹剖把祖先拆成 log 個鏈的字首,再使用區間 \(\text{chkMin}\),單點查詢的線段樹,這樣是 \(O(m \log ^2 n)\),足矣通過。(應該能做到更優但較為複雜,例如可以先化為矩形 chkmin ,單點查詢形式,然後一開始預處理那個(x 拆成 log 個區間)線段樹結構,每個線段樹(y 離散化後)位置按權值排序,然後每輪進去用線性並查集算出每個位置最優點值,還要定位離散化節點,把查詢離線雙指標,這樣就 \(O(m \log n)\) 一次,太複雜,好像不可實現。。)

總複雜度 \(O(m \log ^3 n)\)

\(O(m \log ^ 2n)\)

code

B. 襪子

沒利用到隨機性質,哈哈。

首先詢問半平面點個數是可做的,一種做法 是分塊後極角排序雙指標,詢問二分。

考慮這個題,考慮設定一個閾值 \(B\),顏色出現次數 \(>B\) 的之間套上面那個做法,小的考慮,每次把顏色相同的放到一組裡,只需要動態維護一下這個順序下,每個點有多少顏色相同的在它前面,並且快速求字首和,這個可以樹狀陣列,並且和排序同瓶頸。

既然出現次數都 \(\le B\) 了,那麼我們分組可以把每塊固定在 \([B, 2B - 1)\) 範圍內,這樣每組都是 \(O(B)\) 的了。

總複雜度 \(O(B^2\frac{n}{B} \log { B^2} + q \frac{n}{B} \log {B^2})\)

,取 \(B = \sqrt{q}\) 最優,為 \(O(n\sqrt{q}\log q)\)

code