動態維護一個區間內只出現了一次的數,操作涉及插入和刪除
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 即可。