好神啊 /kk
思路
可以證明, swap(A,B)
不會對答案造成任何影響,而如果每個人走的路徑確定是 \(A \to B\) 或 \(A \to 1 \to n \to B\) ,那么答案就是一條邊被覆蓋的次數的最大值。
為了方便,把題意換一下,變成每個人覆蓋一些點, \([l,r]\) 或 \([1,l)+(r,n]\) 。
先讓所有人都覆蓋 \([l,r]\) ,然后反轉一個人,帶來的變化就是 \([l,r]--, [1,l)++, (r,n]++\) 。
容易發現如果兩個被反轉的人的 \([l,r]\) 無交,那么一定不優。
所以會存在一個點,使得每個被反轉的區間都經過這個點。
設被反轉的區間的交是 \([x,y]\) ,一開始每個點被覆蓋的次數是 \(a_i\) ,反轉后每個點被覆蓋的次數是 \(b_i\) ,令 \(t\) 為 \([x,y]\) 中 \(b\) 最大的位置。
性質 1 :存在最優方案使得 \(b_t \ge \max b_i - 1\) 。
證明:如果 \(b_t \le \max b_i - 2\) ,那么同時取消反轉一個 \(l=x\) 和 \(r=y\) 的區間, \(b_t\) 會增加,且答案不會更劣。
性質 2 :存在最優方案使得 \(a_t = \max a_i\) 。
證明:如果存在 \(a_k > a_t\) ,那么顯然 \(k \notin [x,y]\) (否則 \(b_t\) 就不是 \([x,y]\) 中最大的),所以至少會有一個區間沒有覆蓋 \(k\) ,所以有 \(a_k-b_k \le a_t-b_t-2\) ,化簡得 \(b_k-b_t \ge 3\) ,與性質 1 矛盾。
性質 3 :對於所有 \(a_k = \max a_i\) , \(k \in [l,r]\) 。
證明:和性質 2 差不多。
所以我們可以確定一個所有反轉的區間都經過的位置 \(t\) ,且知道最終答案就是 \(b_t\) 或 \(b_t+1\) 。
二分答案,判斷 \(w\) 是否可行。
令 \(cnt\) 為反轉的區間個數,那么由於 \(w=b_t=a_t-cnt\) 或 \(w=b_t+1=a_t-cnt+1\) ,所以只需要分別判一下 \(cnt=a_t-w(+1)\) 即可。
為什么強行定了 \(cnt\) 仍然滿足二分性呢?如果 \(w\) 過大,那么 \(cnt\) 過小,那么就把最優解中反轉的區間刪掉一些即可。顯然刪掉之后仍然滿足上面三條性質。
從 \(1\) 往 \(t\) 貪心,貪心到 \(i\) 的時候把所有還沒有反轉且 \(l \le i, r \ge t\) 的區間按 \(r\) 加入大根堆中,而 \(i\) 會對前綴選的區間個數有一個限制(至少是多少),就貪心地在大根堆里面補齊即可。
限制長得像這樣: \(a_i-x+(cnt-x) \le w\) 。特別地, \(i=t\) 時令 \(x=cnt\) 。
貪心結束后再掃一遍判是否合法即可。貪心正確性比較顯然。
復雜度 \(O(n \log^2 n)\) 。
代碼
咕了。