AGC062
[AGC062A]Right Side Character
咋這麼難?
不難打標看出結論:當且僅當一個字首是 \(A\) ,一個非空字尾是 \(B\) 時答案是 \(B\) 。
[AGC062B] Split and Insert
VP 時的思路。
首先考慮倒著,每次選擇一個子序列放到最後,方便起見我們把操作序列也 reverse 一下。
這樣,我們發現,如果設 \(S_i\) 為覆蓋了 \(i\) 的操作集合(我們把 \(S_i\) 預設為降序排列),那麼最終 \(S_i\) 相同的一定是在一起的,這樣會形成若干個區間,並且這些區間的 \(S_i\) 按照字典序從小到達排列。
此時唯一的限制就是:每個 \(S_i\) 相同的區間內的數在 \(p\) 中的位置遞增。
設 \(M\) 為不同的 \(S_i\) 個數,考慮 dp,設 \(f_{i,j}\) 表示考慮了前 \(i\) 個位置,當前位置的操作集合是 按字典序排序的 第 \(j\) 個的最小代價,轉移時可以維護字首 \(\min\) 做到 \(O(nM)\)。
但是我們發現 \(M=2^k\) 根本開不下,考慮最佳化一下。
注意到最終用到的只有 \(O(n)\) 個區間,那麼我們考慮貪心的保留權值和最小的 \(n\) 個 \(S_i\),這個可以用類似超級鋼琴的思路求出來。
然後叫了一下發現 WA 了,再想想發現有可能一段長度很長的區間,我們想要讓他取到儘可能小的權值和,但是有字典序的限制所以有可能取不到這個數,此時應該在前面 “墊” 一些段,故不一定是最小的 \(n\) 個有用。
此時我們充分發揮人類智慧,保留最小的 \(pn\) 個 \(S_i\),實測 \(p=3\) 能過。
複雜度 \(O(n^2m+nm)\) ,跑的飛快。
雖然是個假做法但是複雜度比題解要優。
[AGC062C] Mex of Subset Sum
從小到大排序,設字首何為 \(S_i\),所有 \(x<S_i\) 且不能被前 \(i\) 個數表示出來的數的集合為 \(E_i\) 。
考慮從 \(E_{i-1}\) 推到 \(E_i\) :
首先,一個數 \(x\) 不能被表示出來,當且僅當 \(x\) 不能被前 \(i-1\) 個數表示出來,且 \(x-A_i\) 不能被前 \(i-1\) 個數表示出來,這裡的不能被表示有三種:\(<0,\in E_{i-1},>S_{i-1}\) 。
我們簡單討論一下:
- \(S_{i-1}<A_i\) ,此時 \(S_{i-1}\) 內的數和 \((S_{i-1,A_i})\) 內的數都不能被表示,並且因為 \(A_i\) 不降,之後也一定不能被表示,且一定不會有更小的不能被表示的數,所以這些數一定在答案裡,如果他們個數 \(\geq K\) 就直接輸出。否則,就把 \(x-A_i\) 必須 \(\in E_{i-1}\),把這些數加進來就好了,可以發現與 \(E_{i-1}\) 相比,\(E_i\) 大小最多多 \(K-1\) 。
- \(S_{i-1}\geq A_i\),那麼 \(E_{i-1}\) 中 \(<A_i\) 的部分一定也是一定在答案裡的,和上面一樣處理。否則對於 \((A_i,S_{i-1})\) 中的數,只有 \(x\in E_{i-1},x-A_i\in E_{i-1}\) 才行,對於 \((S_{i-1},S_i)\) 中的數也要求 \(x-A_i\in E_{i-1}\),可以發現加進來的數大小也不超過 \(E_{i-1}\) 。
綜上 \(E_i\) 的大小不會超過 \(Ki\),暴力做複雜度就是對的了。
[AGC062D] Walk Around Neighborhood
神秘思維題,感覺有點像是二維的摩爾投票。
我們先從小到大排序,如果前 \(n-1\) 個數的和 \(<a_n\) 一定無解,因為 \(a_n\) 不管咋走都會超。
否則,一定有解,並且答案一定在 \([\frac{a_n}{2},a_n]\) 中,這是因為:上界 \(a_n\) 的構造很簡單,我們先走到 \(a_n\) 所在的正方形上,然後剩下的步長一定與這個正方形都有交,因此我們能一直保持在邊界上,最後用 \(a_n\) 走回去就好了。下界 \(\frac{a_n}{2}\) 也是因為小於這個,\(a_n\) 不管咋走都會出去。
那麼我們列舉答案 \(r\in [\frac{a_n}{2},a_n]\) ,注意到我們走的過程形如:
- 先用若干步數走到 \(r\) 的正方形上
- 中間一些步數在正方形邊界上跳
- 再用一些步數走回去
並且因為 \(r\in [\frac{a_n}{2},a_n]\) 所以只要能走到邊界上就一定能保持在邊界上,所以我們只需要找兩個集合,滿足一個集合能走過去,一個集合能走回來就行了。
判斷一個集合 \(S\) 能否走到 \(r\) 的正方形邊界:
- 若 \(S\) 中小於 \(r\) 的數的和 \(\geq r\),那麼顯然一定能走到 \(r\) 。
- 否則,我們一定要用 \(\geq r\) 的數,因為用了它之後一定要麼走出去要麼走到邊界上,所以用一個就夠了,記為 \(x\)。考慮什麼時候不合法,發現若 \(x\) 很大,\(r\) 很小,我們就很容易跳出去,故 \(x\) 一定保留最小的一個,並且此時可以發現跳 \(x\) 的位置越偏越不容易跳出去,所以我們一定把 \(<r\) 的數沿著同一個方向走,所以記這些數的和為 \(s\),那麼合法的充要條件是 \(s\geq x-r\) 。
因為我們要分成兩個集合,並且可以發現如果有 \(\geq r\) 的數一定用比不用好,因為 \(r\in [\frac{a_n}{2},a_n],x-r\leq r\) 更容易滿足,並且因為 \(r\leq a_n\),所以一定至少有一個 \(x\) 可以用,如果還有就再保留次小的,否則就只能選擇第一種。
現在我們要找兩個集合,第一個大小 \(\geq A\),第二個 \(\geq B\) ,那麼一定每個數都被選進某一個了。
用 bitset
維護可能集合大小,每次 _Find_next
找到 \(\geq A\) 的最小的子集,然後判斷剩下的數是不是 \(\geq B\) 就行了。
複雜度 \(O(\frac{n^2}{w})\)。
[AGC062F] Preserve Distinct
這是人做的題?
首先,對於第 \(i\) 堆,求出它第一張牌對應的另一張所在的堆,記為 \(p_i\) 。
從 \(i\to p_i\) 連邊,形成了一個基環樹森林。
首先,環外的點,每次刪葉子,顯然可以刪空,所以現在只有一堆環。
然後,不同連通塊是獨立的,因為我們可以一個一個刪,刪的過程中別的顯然不影響,如果刪完了最好,沒刪完也說明此時這個環的堆頂的牌一定都只在這個環出現,對別的沒有影響。
因此我們可以一個一個環處理,我們按照環的順序記為 \(1,2,3\cdots k\) ,第 \(i\) 堆堆頂的牌是 \(a_i\) 。
那麼這些牌一定形如:
- \(1:a_1\cdots a_{k}\cdots\)
- \(2:a_2\cdots a_2\cdots\)
- \(\cdots\)
- \(k:a_k\cdots a_{k-1}\cdots\)
先討論一些簡單的情況,看能不能得到一些性質: