翠竹叶飞
Hello the cruel world.

考虑非莫队的离线算法。。

若[l,r]中有重复数值很麻烦,考虑取一个数为代表(最左或最右)

1.最左:用BIT,先把所有第一个出现的数扔进去,将询问左端点升序,每次都可能产生历史的无用点,并出现新的“第1次出现点”,只需将其加入BIT即可。

2.最右,做法类似

 

当然有在线做法了(copy),

考虑区间查询l~r之间的颜色种数,其实就是求所有满足(l<=i<=r,next[i]>r)的个数,因为如果某个点的next已近超出了这个区间的范围,就说明这个点对答案产生贡献了。

这个时候问题就已近被转化为给定一个序列,求区间l~r之间权值大于r的个数。

那么我们对于每个点都在可持久化的权值线段树中构造一条新的线段树链就好了,查询就是常规的权值线段树的查询。

对于每个点都要新建一条最多Log2 N个点的链,空间复杂度N log2 N;对于每次询问最多递归深度为Log2 N层,时间复杂度M Log2 N。

posted on 2017-06-04 12:59  翠竹叶飞  阅读(116)  评论(0编辑  收藏  举报