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\) 個的最大收益,得轉移為:
這樣轉移就能保證單調不降了。這里對 \(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)\) 為狀態二,則將子樹取反。
(這題代碼在有了)