序列数颜色trick
感觉很厉害
-
判定颜色都是否出现过
这一类可以采用特殊的处理方式达到单次 \(O(\log n)\)。
考虑记录每个颜色的前驱位置 \(pre_i\)。
那么对于 \([r+1,n]\) 的点,若存在 \(pre_i则必然有颜色不在 \([l,r]\) 中出现。
那么可以愉快地维护区间最小值,然后在线段树上二分。
\(pre_i\) 可以用 multiset 维护。
例题:P4632 [APIO2018] New Home 新家 -
数区间颜色种数
相当于计算 \([l,r]\) 中有多少个点满足 \(pre_i。
那么相当于对 \((i,pre_i)\) 做二维数点。 -
数单种颜色个数
一般的经典动态开点线段树可以随便搞。
颜色值域有限制时可以值域分块。