BZOJ 1878HH 的项链

Posted sdchr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1878HH 的项链相关的知识,希望对你有一定的参考价值。

已知: $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 一下就好了。

直观地感受一下?

以上是关于BZOJ 1878HH 的项链的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1878 [SDOI2009] HH的项链

[BZOJ1878][SDOI2009]HH的项链

bzoj1878 [SDOI2009]HH的项链

BZOJ [1878[SDOI2009]HH的项链

BZOJ1878: [SDOI2009]HH的项链 (主席树)

BZOJ_1878_[SDOI2009]HH的项链_莫队