1. 程式人生 > 其它 >【題解】CF1609 Deltix Round, Autumn 2021 (Div. 1 + Div. 2)

【題解】CF1609 Deltix Round, Autumn 2021 (Div. 1 + Div. 2)

三棵線段樹。

A

將每個數表示成 \(2^k\times c\),其中 \(c\) 是奇數,顯然最後一頂找到一個最大的 \(c\) 將所有的 \(2^k\) 都乘過去即可。

程式碼:Submission #137565948 - Codeforces

B

一次操作最多消除一個 abc 也一定消除一個 abc,維護 abc 出現次數即可。

程式碼:Submission #137566109 - Codeforces

C

考慮一個點往後跳,僅跳 \(1\) 和質數跳到的第一個質數所處的位置,然後再看這個位置往後跳能跳多少個 \(1\) 就行。這兩個東西倒著推很好求。

程式碼:Submission #137567001 - Codeforces

D

一個連通塊可以連成一個菊花,合併兩個連通塊需要一條額外邊。記錄額外邊的個數,並且維護連通塊大小,每次選最大的若干個連通塊合併即可。

程式碼:Submission #137567369 - Codeforces

E

考慮 dp:令 \(f_{i,0/1/2}\) 表示到 \(i\) 接了長度為 \(0/1/2\) 的子序列最小花費代價。轉移顯然,用線段樹維護即可。

程式碼:Submission #137568052 - Codeforces

F

考慮建立小根笛卡爾樹和大根笛卡爾樹。當左端點取到 \(l\) 時,很容易求得如果此時要求答案區間最小值為 \(x\) 的話,右端點應當取到的區間。最大值同理。

將所有數按照 \(\mathrm{popcount}\)

分組,每一組分別計算答案。如果一個可能的右端點被最大值右端點合法區間覆蓋過,並且被最小值右端點合法區間覆蓋過,那麼可取。因為最大值右端點合法區間互不相交(最小值合法區間同理),用線段樹維護覆蓋次數,當覆蓋次數為 \(2\) 則意味著合法。時間複雜度 \(O(n\log n)\)

程式碼:Submission #137566518 - Codeforces

G

注意到最終序列長度為 \(n+m-1\) 。將兩個序列差分,除了 \(a_1,b_1\) 必須在開頭外,剩下的一定是從小到大排序更優。因為題目保證 \(a,b\) 差分後除去開頭滿足單調不減,所以用線段樹維護 \(b\),每次詢問考慮插入 \(a\)

的每一個位置計算貢獻即可。時間複雜度 \(O(qn\log m)\)

程式碼:Submission #137569481 - Codeforces

H

不會。