已知: $n(10 ^ 5) $
? \(\left\{ a_i \right\}(10 ^ 5)\)
? \(t(10 ^ 5)\)
条件: 区间 \([l, r]\)
求: 不同数个数
思考每个细节,我能想到这些东西:
多组询问 —— 离线,在线
区间 \([l, r]\) —— 莫队
? 移动 \(r\) ,维护所有 \(l\) 的答案
? 线段树
? 可持久化线段树
? 分块
不同数 ——
cnt, v[]
? —— 只考虑最后一个,把最后一个的权值当作 \(1\)
? —— \(l \le i \le r, pr[i] < l\)
考虑莫队算法,移动端点的时候维护
cnt, v[]
即可,时间复杂度为 \(O(n \sqrt n)\) 。我能简化这个结果吗?
直观地感受一下?
我能不能用其他方式推导出这个结果?
莫队算法,以及第一种描述方式的意义不大了,看看能不能用第二种对不同数的描述方式。
把询问离线,移动右端点,用树状数组维护点权,区间求和,时间复杂度为 \(O(n \log n)\) 。
我能简化这个结果吗?
可以使用线段树。
直观地感受了一下?
如果要求强制在线呢?
我把线段树可持久化就好了。
还有没有其他做法?
第三种做法的实用性应该才是最高的,它只需要满足两个数量关系。
使用树套树来限制两个条件,可以直接解决这个问题。
直观地感受一下?
能不能移动端点?
显然也是可以的,维护一棵线段树,如果要求强制在线,那么就可持久化线段树。
直观地感受一下?
区间问题通常还可以分块,我能分块做吗?
把序列分块,每块按照 \(pr[]\) 排序,每次
lower_bound
一下就好了。直观地感受一下?