關於一類資料處理

LCat90發表於2024-06-27

動態維護一個區間內只出現了一次的數,操作涉及插入和刪除

Sol1

值域分塊,簡單來說還是暫時壓縮。每次新插入一個數就將 \(x/M\to x\)

最後查詢 \([1,M]\),只要有一個位置可以,那麼就在這裡暴力找整塊,也只是 \(S/M\) 的大小。

\(M=\sqrt S\) 那麼複雜度就是和莫隊一樣的根號了。

Sol2

考慮維護一個 vector 或者棧,你考慮按照加入的順序最後同一刪除,然後這個刪除就維護一個懶標,複雜度和主演算法一致。

CF1000F 主席樹做法

這道題的主席樹不想平常那樣了,這裡的更改涉及 \(lst_i\),更為複雜,容易陷入死迴圈。

首先注意一個很重要的點:主席樹一旦初始化至 \(i\),而且主席樹維護區間 \([1,i]\),那麼這個主席樹的 \(j<i\) 的點一定不可改,只能在 \(i\) 上做文章。

注意到 \((lst_i,i)\) 的二元組。

轉化:區間內最後的 \(i\)\(lst\) 值小於 \(r\) 即有解,也就是維護 \(\min lst_i\) 以及返回下標。

那麼對於版本 \(i\),只需要修改 \(i\) 的同時,把 \(lst_i\) 位置上的值設定為 INF 即可。

相關文章