CF1322


Codeforces Round #626 (Div. 1, based on Moscow Open Olympiad in Informatics)

A

\(s_i\) 為前綴左括號個數減右括號個數,每一段 \(s_i<0\) 的區間都需要操作,操作還需包含一段負區間末尾 \(s_i=0\) 的位置。

B

考慮第 \(k\) 位,將所有數在模 \(2^{k+1}\) 意義下考慮,若兩個數的和 \(\in [2^k,2^{k+1}-1] \cup [2^k+2^{k+1},2^{k+2}-2]\),則其在第 \(k\) 位為 \(1\),通過雙指針統計個數,按奇偶性計算即可。

C

\(S(x)\) 為右部圖的點 \(x\) 在左部圖的與其相連的點集,給每個點集 \(S(x)\) 初始權值為 \(c_x\)。將相同的點集進行合並,合並后的權值為相同的點集權值和。最終答案為所有剩余點集權值的 \(\gcd\),這里不考慮空集。

D

先將序列翻轉,將單調不升變為單調不降。設 \(f_{i,j}\) 為考慮了攻擊力 \(\leqslant i\) 的選手,且攻擊力為 \(i\) 的選手有 \(j\) 個的最大收益,得轉移為:

\[\large\begin{aligned} f_{l_i,j}&=\max\{ f_{l_i,j-1}+c_{l_i}-s_i \} \\ f_{j+1,\frac{k}{2}}&=\max\{ f_{j,k}+\frac{k}{2}c_{j+1} \},j\in [l_i,n+m] \end{aligned} \]

這樣轉移就能保證單調不降了。這里對 \(k\) 的枚舉范圍進行限制,當前攻擊力為 \(l_i\) 時,對於 \(l_i\) 枚舉前 \(n\) 項,對於 \(l_i+1\) 枚舉前 \(\frac{n}{2}\) 項,對於 \(l_i+2\) 枚舉前 \(\frac{n}{4}\) 項,\(\dots\) ,這里相當於模擬了所有攻擊值的二進制加法,因為對於每個 \(i\),其有效的狀態數為 \(n + \left \lfloor \dfrac n2 \right \rfloor + \left \lfloor \dfrac n4 \right \rfloor + \left \lfloor \dfrac n8 \right \rfloor + \cdots + \underbrace{1 + 1 + \cdots + 1}_{\text{less than } m} = O \left( n + m \right)\),所以復雜度為 \(O(n(n+m))\)

E

先考慮 \(01\) 序列,發現 \(00\)\(11\) 都是穩定的,因此只需處理 \(01\) 交替的段。考慮枚舉一個分界線 \(k\),將 \(\leqslant k\) 的位置都看作 \(0\),所有 \(>k\) 的位置都看作 \(1\),若位置 \(i\)\(01\) 表示下的最終結果為 \(0\),則位置 \(i\) 最終的值 \(\leqslant k\),否則 \(>k\)。得當分界線從 \(k\) 枚舉到 \(k+1\) 時,位置 \(i\) 的結果從 \(0\) 變成了 \(1\),則位置 \(i\) 最終的值為 \(k\)

所有分界線得出的序列中 \(01\) 交替的段的最長長度除以 \(2\) 為操作次數,因為每次操作后 \(01\) 交替的段的長度會減少 \(2\)

考慮求出每個位置向兩邊擴展 \(01\) 交替的段的最長長度,根據該長度分類討論即可得出當前位置的最終的值。可以通過 \(ST\) 表預處理最值,然后二分求解最長長度。

F

不難發現答案上界為 \(n\),其可以通過數學歸納法證明,去掉一個葉子就為一棵 \(n-1\) 個點的樹,該葉子要么最小,要么最大。

先考慮判定無解的情況。先將樹定為有根樹,考慮樹上的一條邊 \((fa,x)\),若其沒有被路徑覆蓋,則可以不考慮這條邊,若其被覆蓋了,那么該邊一定滿足這兩種狀態之一:\(c_x < c_{fa},c_x > c_{fa}\)

一條路徑就是使若干邊的狀態相同或者相反,那么可以用並查集來判定是否有解。

發現答案具有單調性,可以二分求解,考慮用樹形 \(DP\) 來判定二分。當前二分的值為 \(k\),設 \(f_x\) 為邊 \((fa,x)\) 為狀態一時 \(c_x\) 的最小值,不難發現當邊 \((fa,x)\) 為狀態二時 \(c_x\) 的最大值為 \(k+1-c_x\),將 \(x\) 子樹內值域取反即可。

考慮 \(x\) 的子樹 \(y\)\(c_x\) 的限制:

\((x,y)\) 沒被覆蓋,則不考慮。

若覆蓋 \((x,y)\) 和覆蓋 \((fa,x)\) 的路徑有交,即 \((x,y)\)\((fa,x)\) 的狀態有關聯,那么已知 \((fa,x)\) 為狀態一時,就能確定 \((x,y)\) 的狀態了。\((x,y)\) 為狀態一時,得 \(c_x > c_y\),得其對 \(c_x\) 的限制區間為 \([c_y+1,k]\)\((x,y)\) 為狀態二時,得 \(c_x < c_y\),得其對 \(c_x\) 的限制區間為 \([1,c_y-1]\)

若覆蓋 \((x,y)\) 和覆蓋 \((fa,x)\) 的路徑無交,則 \(y\) 子樹內的狀態選擇和 \((fa,x)\) 的狀態無關,考慮 \(y\) 子樹內的狀態的某種選擇對 \(c_x\) 的限制區間為 \([l,r]\),得另一種狀態對 \(c_x\) 的限制區間為 \([k+1-r,k+1-l]\),得 \(y\) 子樹對 \(c_x\) 的限制區間為 \([l,r] \cup [k+1-r,k+1-l]\)

那么將 \(x\) 的所有子樹對 \(c_x\) 的限制區間取交,限制下的集合最小值即為 \(f_x\)。發現 \([l,r] \cup [k+1-r,k+1-l]\) 不一定是一段連續的區間,因此要用線段樹掃描線來維護。

實際上可以更簡便,發現若 \([l,r] \cup [k+1-r,k+1-l]\) 不是一個連續的區間,則其一定是兩個以 \(\frac{k+1}{2}\) 為對稱軸的區間,那么可以維護中間空出的部分一定包含 \(\frac{k+1}{2}\)。因此維護區間的交和中間空出的部分的並即可線性轉移。

構造方案時,可以在樹上差分打標記,若邊 \((fa,x)\) 為狀態二,則將子樹取反。

(這題代碼在有了)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM