关于一类数据处理

动态维护一个区间内只出现了一次的数,操作涉及插入和删除

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 即可。

posted @ 2024-06-27 21:42  LCat90  阅读(3)  评论(0编辑  收藏  举报