区间最小众数-分块

裸题-【bzoj2724】[Violet 6]蒲公英

就是求[l,r]间的最小众数(顾名思义)

现有一个小定理:令i=rep(a)为a集合的最小众数,于是我们有rep(a∪b)∈rep(a)∪b;

这个显然。

先思考一下无修改的操作:

既然是分块,中间整块的信息肯定直接用(不然就是暴力啦)

但是这里的信息有点难合并利用啊(知道两个不同块的最小众数,如何求出其两个块的并的最小众数)

分治一下T(N)=2T(N/2)+(N log N)

时间复杂度O(blo log blo)

所以维护一下f[i][j]表示第i到第j个块的最小众数

所以维护总时间为

T(N)=blo*blo*blo*log(blo)=n^1.5*log(n)

因为O(log(sqrt(n)))=O(log(n))

查询一下的时间复杂度整块的O(1),从f中拿啊。不完整的话由上式知也是前一个散块和后一个散块的中的元素可能为rep,O(sqrt(n))个元素,枚举一下个数可以在中间几个块查为blo*log(blo)*(n/blo)=n*log(n)

修改一下的时间复杂度就是改一下当前此块和f中的值,主要是O^1.5*log(n);

就这么多了

 

posted @ 2017-06-01 16:31  dancer16  阅读(413)  评论(0编辑  收藏  举报
描述