CF1935 A-C題解

XYukari發表於2024-03-19

A

\(s\) 翻轉後的字串為 \(t\),考慮進行 \(n\) 次操作可能生成出哪些字串:

  1. 只進行翻轉操作——\(s\)
  2. 先複製再 \(n-1\) 次翻轉——\(s+t\)
  3. 先翻轉,再複製,再翻轉 \(n-2\) 次,\(t+s\)
  4. 多次複製的情況。

情況 2 顯然劣於情況 1;情況 4 得到的字串的開頭一定是 \(s\) 或者 \(t\),分別劣於情況 1,3。所以答案一定在情況 1,3 中選擇——不難發現,如果 \(s\) 字典序小於 \(t\),答案是情況 1 的 \(s\),否則答案是情況 3 的 \(t+s\)

B

不難發現,但凡能分成多段,一定可以分成兩段。分成兩段,樸素的想法是列舉分界點,對兩段分別求 mex。恰好字首 mex 可以 \(O(n)\) 求,故求出字首 mex \(pre_i\) 和字尾 mex \(suf_i\),列舉找到到 \(pre_i=suf_{i+1}\) 位置即可。

求字首 mex:開 bool 陣列 \(v\) 和 mex 指標 \(p\)。遍歷到 \(a_i\) 時將 \(v_{a_i}\) 設為 true,並將 \(p\) 向後移動到 \(v_i\) 為 false 的位置,\(pre_i\gets p\)。在不斷新增 \(a_i\) 的過程中,\(p\) 一定單調遞增,複雜度為 \(O(n)\)

C

重要性質:如果將資訊按照 \(b_i\) 排序,在選定了最小的 \(b_l\) 和最大的 \(b_r\) 的情況下,我們任選 \(l<i<r\) 都不會對式子關於 \(b_i\) 的部分產生影響,只需要考慮含 \(a_i\) 的部分即可。

一個顯然的想法是列舉 \(l,r\),然後對 \(i\in [l,r]\)\(a_i\) 排序,貪心地從小到大選取,使總和不超過 \(L\),選出的資訊條數與答案取 max。這個複雜度是 \(O(n^3\log n)\) 的,考慮怎麼最佳化。

在定了 \(l\),列舉 \(r\) 的過程中,我們可以記錄一下經過的 \(a_i\) 的和 \(sum\)。一旦 \(sum+\sum\mid b_{p_{i+1}}-b_{p_i}\mid>L\),就從 \(sum\) 裡從大到小減掉一些 \(a_i\),這可以用優先佇列維護。然後用當前佇列 size 對答案取 max 即可。