青島二中集訓日報(D7-D8)

youlv發表於2024-06-20

打模擬賽,順便複習了ACAM,學習了全域性平衡二叉樹.

D7


T1

簡單貪心題.

直接上正解.首先同時操作的執行緒只有兩個,情況比較簡單,只有兩種情況,一種是兩個執行緒同時工作,一種是隻有一個執行緒工作.顯然最大化同時工作的時間是最優的.

來個表面的簡單假貪心,直接考慮在所有可行葉子裡面摩爾投票.但是這樣顯然不成立,因為隨著葉子消掉,可能有新葉子解鎖.所以從下向上看不是很方便.考慮從上向下看.既然當前貪心的矛盾是貪心決策與依賴關係不確定性的矛盾,那就直接從依賴關係明確的方向看問題,也就是討論從一個節點出發的兒子子樹.子樹間互不干擾,考慮摩爾投票.如果出現過半的一個子樹,只有這個子樹內部可能進一步增加雙執行緒時間.在這個子樹內考慮即可.

複雜度顯然是 \(O(n)\) 挺簡單的.


T2
資料結構題.

暴力:處理矩形覆蓋一類問題,要麼二位字首和,要麼掃描線.

二位字首和顯然必然 \(n^2\) ,沒啥前途,但是好想.

直接二位字首和把平面的操作結果跑出來,然後考慮把上連續和下連續分別討論,然後排除同時連續的,同時連續這一塊沒啥好的 \(n^2\) 做法,直接上個線段樹多個 \(log\).

期望30分(其實改一下可以到40) 但是MLE到10,警鐘敲爛.

在這裡掃描線的處理思路是類似的.

另外還有一種更有前途的統計方式,就是把掃豎排變成掃橫排,對每個位置維護一下豎向連續1的個數,考慮元素之間互相貢獻,貢獻為:

\[\sum_{i }^{} \sum_{j} \max (len_i, len_j) \]

這東西暴力是 \(n^3\) 的,考慮最佳化一下這個式子,顯然地聯想到統計每個 \(len\) 能貢獻的次數,於是變成:

\[\sum_{i }^{} len_i \times rk_i \]

其中 \(rk_i\) 為對 \(len\) 的嚴格排名(同值不同排名),這個東西可以簡單sort拿到暴力分了.

這個方案比第一個更有前途一點,因為首先這個東西是對一整排整體操作的,加上 \(len\) 的變化與區間抑或1操作直接相關.此外,\(rk\) 這個東西也是可以資料結構維護的,相比第一個做法更簡潔,也更少一些討論.

因此雖然做法一也能推到正解,但是來自做法二的解法顯然更自然一些,就從這裡開始考慮.

正解:採取掃描線維護行,考慮維護 \(len_i\),分析區間異或時發生了什麼.

對於 \(0\)\(1\),\(len_i\)變成了 \(1\)

對於 \(1\)\(0\),\(len_i\)變成了 \(0\)

其餘沒有經過操作的地方,是 \(1\) 的會 \(len++\)

發現這個 \(len++\) 直接導致 \(len\) 一行一變,沒法用更高明的辦法維護了.於是考慮轉化為不變數,考慮 \(1\) 的起始點的絕對位置不變,變的是當前的線,考慮把 \(len_i\) 設為 \(n-pos\) 其中 \(pos\) 為最靠前 \(1\) 的位置,再除去貢獻.答案用權值線段樹維護,這是可以做到的.

考慮維護操作,\(1\)\(0\) 是容易的,直接DS維護序列數區間 \(1\) 的個數然後取反調整貢獻即可.考慮這個 \(0\)\(1\) ,首先,要撤銷過去的 \(0\)\(1\) 的貢獻,要在維護答案的線段樹上調整的是過去這次操作所在的行,同理,新的貢獻與當前行有關.看起來一個區間內可能有多種不同的貢獻,複雜度爆炸,不過因為考慮區間內 \(1\) 的貢獻情況,唯一的操作就是區間染色.因此存在顏色段均攤.事實上不必 set 維護,直接繼承這個線段樹思路就行,如果當前段顏色不一樣就下放,貢獻開個 map 統計一下,然後統一更新,就可以做到 \(nlogn\).

啟發:首先對於平面問題,橫行考慮和豎列考慮是典型的改換觀察角度來發掘問題內部矛盾的,這展現了一個典型的改換角度來發掘/接近/利用性質,尤其是關鍵性質的時候.

其次就是平面掃描線,很有用,不要忘了.

然後就是轉化成DS問題後的轉化,大膽從操作,查詢兩方面解構區間需要維護的資訊和更新方式,來尋找可靠的資料結構.


T3

感覺自己思路和題解差別極大,由於被細節卡麻,沒有驗證自己的想法.

場上思路:對於這個序列,硬套字串演算法顯然沒前途.考慮發掘性質.

首先對著 \(abba\) 手算了一下,發現如果把一個串約成一個規範的形式,是可以透過討論和計算得出答案的.因此首先的思路是處理串 \(S\)

想到了縮串,感覺沒想法,就直接去原串找性質了.題解是從縮串切入的,不過感覺中心思想是相似的.

發現每次倍增構造,相當於對當前串取反接在後面.再深入一步,把這個過程視作二叉樹,奇數層的區間左右是相反對稱的,區間中點的兩個字元不同.偶數層的區間軸對稱,區間中點的兩個字元相同.有了這個性質,相當於任取一段序列,直接透過相鄰字元的關係,就可以得到這棵樹上非葉子節點的奇偶染色.

然後可以考慮直接還原這棵樹,發現對於當前的葉子層考慮,也是類似的討論,發現只有左右顏色都不同時,可能是葉子節點,其餘的高層節點左右都有到葉子層的區間(邊界除外),因此就可以找出上一層節點,依次類推,直到彙總到一個根節點.這時找到的就是最小的一棵能夠用中序遍歷的一部分描述當前串的二叉樹.

至此第一問解決考慮第二問就是把所有的用這個樹能維護而不能用更小的維護的情況算出來,其實就是樹不退化,是可以計算方法得知的.

沒有經過驗證,但是感覺挺對的,就是不好實現.

正解:直接縮串+dp,比較神秘.

D8


T1

被卡麻了.

簡單題,直接上正解.這題就是算動態加邊的邊雙上的資訊.考慮樹性質顯然可以用常規樹方法維護.而邊bcc是可以縮成樹的,把bcc大小設為權值,直接簡單差分維護即可.

倍增LCA奇慢,加上,沒有用tie(0)輸入輸出,導致被卡常,警鐘敲爛.


T2

看著像揹包,其實就是揹包.

暴力:直接變成多重揹包.

場上思路:既然有倍數關係,直接考慮用當前層的數補全 $m \mod a_{i+1} $ 的餘數,然後多出來的物體 \(a_{i+1}\) 個一組直接扔到上一層.根據題目給的性質,每層點數不會太多.

但是想要用組合辦法解決每層的統計問題,發現很複雜很不可做,就過掉了.

正解:直接在上述思路上直接用揹包,套個卷積就完事.
但是還要實現一個高精度,有點煩人.

相關文章