The 2023 ICPC Asia EC Regionals Online Contest (I)

FantasyNumber發表於2024-09-27

比賽連結

B. String

由於 \(T = s_1[i,j]+s_2[j+1,k]\),那列舉 \(T\) 的這個分界點 \(p\)。提前對 \(s_1\) 正串 和 \(s_2\) 的反串建兩個 SAM,那麼把 \(T[1,p]\) 放到 \(s_1\) 的 SAM 上去跑,跑到節點 \(u\),那麼合法的 \(j\) 一定在 \(\text{endpos}(u)\) 中,\(T[p+1,len]\)\(s_2\) 的反串 SAM 上去跑,也同理。

問題就轉化為兩個 SAM 的 link 樹中每次詢問 \((u,v)\) 兩個不同 SAM 中的子樹中顏色集合交的大小。顏色集合就是 endpos 集合。由於 endpos 集合中每個位置只會出現一次,所以可以看每種顏色對這個詢問的貢獻。設顏色 \(i\) 在兩個 SAM 上節點分別是 \(x_i,y_i\),那麼對於一個詢問 \((u,v)\),若 \(x_i\)\(u\) 子樹中且 \(y_i\)\(v\) 子樹中就有一個貢獻。轉化為 link 樹上的 dfs 序,就是 \(dfn_{x_i} \in [dfn_u,dfn_u + siz_u - 1] \land dfn_{y_i} \in [dfn_v,dfn_v + siz_v - 1]\)。離線做個二維偏序即可,複雜度 \(\Theta(n\log n)\)

C. Multiply Then Plus

考慮詢問 \(\max(x_i \cdot a+y_i)\) 時有用的 \((x_i,y_i)\),設 \(x_i \cdot a + y_i = t\),那麼 \(y_i = -a \cdot x_i + t\),那麼求最大的 \(t\) 可以看作用一條斜率為 \(-a\) 的直線,找到最大的截距使得直線上存在一個點。那麼最大的 \((x_i,y_i)\) 肯定在所有點的上凸殼上,可以每次二分一個點滿足 \(k_{i,i-1} > -a > k_{i,i+1}\) 找到。

考慮加入區間詢問和修改,加入刪除點可以透過線段樹分治轉為只加入,區間詢問考慮用線段樹維護區間凸殼,每次 pushup 的時候可以歸併合併兩邊的凸包(只在這個區間所有點加完的時候合併),然後一個靜態的區間詢問可以找到 \(\Theta(\log n)\) 個區間的凸包上二分。複雜度 \(\Theta(n\log^3 n)\),無法透過。

考慮去掉二分,把詢問按斜率排序,線上段樹分治的葉子時,把一個詢問掛到 \(\Theta(\log n)\) 個區間上,線上段樹分治回溯時,當要破壞一個區間的凸包時,對這個區間上的凸包和詢問做雙指標,即可均攤 \(\Theta(1)\)

複雜度 \(\Theta(n\log^2n)\)

H. Range Periodicity Query

每次在字串 \(S\) 的開頭或結尾新增一個字元,設 \(S_i\)\(S\) 長度為 \(i\) 時表示的字串,那麼 \(S\) 的存在長度為 \(p\) 的週期當且僅當在 \(S_p\)\(S_{t_p}(t_p \ge p)\) 這一段連續的時間。

由於週期 \(= n - \text{border}\),那麼二分出 \(t_p\),然後雜湊判斷就找出了這個區間。然後對 \(S_i\)\(i\) 掃描線,對於每個序列的值 \(a_i\),在 \(a_i\) 時刻啟用 \(a_i\) 這個位置,在 \(p_{a_i +1}\) 時刻關掉,詢問離線,每次區間詢問最小值即可。複雜度 \(\Theta(n\log n)\)

J. Minimum Manhattan Distance

考慮一個圓外點到一個圓內對稱兩點的曼哈頓距離和一定是兩倍到圓心的距離,那麼找到離圓心期望距離最遠的即可。由於兩個圓在不同象限,那麼這個點一定在另一個圓上的 \(4\)\(45°\) 方向,都判一次即可。

K. Minimum Euclidean Distance

平面上一個點到一個圓內隨機一個點歐幾里得距離的期望值是 \(\dfrac{1}{2}r^2 +d^2\),其中 \(r\) 位半徑,\(d\) 為點到圓心的距離。每次判斷圓心是否在凸包內可以逆時針看 \(o\)\(p_i,p_{i+1}\) 兩個向量的叉積,都是正就在凸包裡。不在凸包裡就 \(\Theta(n)\) 列舉每個邊界看點到線段的距離即可。複雜度 \(\Theta(nq)\)

F. Alice and Bob

對於一個三個點 \((a,b,c) a \le b \le c\),可以表示為 \((x=b-a,y=c-b)\)

可以打表 \(SG\) 函式發現不合法的只有 \((0,x)\),其中 \(x\) 是二進位制表示下結尾有偶數個 \(0\) 的數。可以用 01trie 從低位開始插每個數,然後查詢時只用找到第一個不同的位置就是結尾 \(0\) 的個數了。複雜度 \(\Theta(n\log V)\)

具體證明見 官方題解

相關文章