关于一类数据处理
动态维护一个区间内只出现了一次的数,操作涉及插入和删除
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 即可。