1. 程式人生 > 其它 >題解 loj2736 【「JOISC 2016 Day 3」回轉壽司】

題解 loj2736 【「JOISC 2016 Day 3」回轉壽司】

題解 loj2736 【「JOISC 2016 Day 3」回轉壽司】

\(\texttt{Solution}\)

根據資料範圍與時限猜測分塊

首先考慮 \(l=1,r=n\) 的部分分

實際上,僅需把序列扔進大根堆裡

對於一次詢問 \(v\),比較堆頂與 \(v\) 的大小關係

如果堆頂大於 \(v\),丟掉堆頂,將 \(v\) 加入堆中,接下來的詢問值定義為原堆頂

否則沒有操作

接下來考慮分塊以求正解

對於一個整塊,同上面所述維護一個大根堆 \(p\),得以在 \(O(\log n)\) 的時間內遍歷完一個整塊

考慮散塊暴力處理,但需要維護出具體的序列

考慮記錄下一個塊距離上次下傳標記後所有未下傳的標記集合 \(S\)

重構塊時從左往右考慮塊中的每個位置

對於第一個位置,如果 \(S\) 能更新該位置,一定是 \(S\) 中最小值最後位於此處

然後原位置上的數將去更新之後的位置,我們將其加入集合 \(S\) 即可

這個過程用一個小根堆 \(q\) 維護即可

時間複雜度 \(O(q\sqrt n\log n)\)

code