多校 A 層衝刺 NOIP2024 模擬賽 06

Qyun發表於2024-10-13

多校A層衝刺NOIP2024模擬賽06

T 小 Z 的手套(gloves)

簽到題

答案顯然具有單調性,排序後二分答案即可。

T 小 Z 的字串(string)

簽到題

注意到 \(n\) 較小,可以使用 \(O(n^3)\) 的演算法,直接上大 \(DP\)

設計狀態 \(f_{i,j,k,0/1/2}\) 表示從左往右填到 \(i\) 位,已經填了 \(j\)\(0\)\(k\)\(1\),且第 \(i\) 位為 \(0/1/2\) 時所需最小花費。

轉移直接大分討即可,注意交換的過程中位移是相對的,每一次交換移動是雙向的,所以目的位置具有一個偏移量,可以提前預知,所以最後直接交換的答案應減半。

T 一個真實的故事(truth)

線段樹,分塊

類似山海經直接合並即可。

全域性查詢竟然是 \(O(1)\),竟然不用考慮平衡複雜度!

時間複雜度瓶頸在修改操作為 \(O(qklogn)\)

口胡一個線上跟 $k$ 無關做法

首先有一個 naive 的想法,對每個點維護所有顏色在它右邊第一次出現的位置,將它視作答案的左端點則右端點為這些位置中的最大值,然後注意到很多點的某些顏色的第一次出現的位置其實是同一個位置,利用這個性質。

考慮分塊,整塊維護塊內點所用位置第一次出現統一顏色的位置,塊內單點維護不同第一次出現顏色的位置,這個可以用 set 維護,然後對每個塊建一顆線段樹直接維護每個點的答案(只計算自己獨立最大的位置)支援區間查詢最小值。

以下統一記 len 為塊長, t 為塊的個數。

初始化 會對每個塊遍歷一次所有顏色,直接硬塞即可,時間複雜度為 \(O(ktlogn)\)

修改 注意到本質上是區間修改變動顏色前驅到該位置之間塊的公共顏色,以及前驅和該位置所在塊的獨立顏色,時間複雜度為 \(O(lenlogn)\)

答案查詢 遍歷所有塊,二分第一個獨立顏色小於公共顏色的點然後更新答案,再線上段樹上插敘這個點以右的最小值更新答案,時間複雜為 \(O(tlogn)\)

\(t,len\) 相等時理論複雜度最優為 \(O(n\sqrt n logn)\),但由於常數原因個人感覺將塊長調大一點實際會更好。

懶得寫了 ...擺擺擺擺

T 異或區間(xor)

笛卡爾樹,啟發式合併,trie,RMQ,分治

全是套路。

考慮弱化小於等於 max 的限制,即考慮每個值所能影響的區間,由此想到到在笛卡爾樹上分治。具體的每次找到當前區間的最大值設為 \(mid\),然後分別 \([l,mid-1],[mid+1,r]\) 進行分治,合併的時候由於和左右區間長度不一樣,考慮使用較小的區間去算貢獻,然後時間複雜度就變為了啟發式合併的時間複雜度。考慮怎麼算貢獻,建一顆 trie 樹,維護字首異或和,每次計算異或上一個值(即能表示區間異或和)且小於等於每一個值的個數,板子直接套就行了。trie 樹更新同啟發式合併,把少的往多的插,然後繼承給父親即可。

時間複雜度為 \(O(qloglogV)\)

p

相關文章