使用权值线段树维护每个数列的元素出现次数,出现次数最大值,出现次数最大值对应的数,然后单点插入和删除直接线段树上单点修改,合并使用线段树合并,这些复杂度都是O(nlogn)的,现在重点在于询问操作
询问操作:
首先将m个数列中相同的数列压缩成一个,显然这只是常数优化,因为最坏可以给出m个不同的数列,然后由于是绝对众数,所以答案只可能在这m个数列的绝对众数中取到,然后对这m个绝对众数采用分治算法,首先先递归计算[l,mid]数列的绝对众数,设为l1,顺便求出其出现次数,然后遍历[mid+1,r]的每一个数列,用线段树查询l1在每个数列中的出现次数求和,最后判断是否是绝对众数,若是则直接返回,否则如法计算右边的绝对众数,并判断是否能成为全局绝对众数。
然后如果l1不存在,那么先递归计算[mid+1,r]的绝对众数,如果不存在则直接返回-1,否则如法计算其是否能成为绝对众数。
可以发现该算法的复杂度与这m个数列给出的顺序有关,最坏可以达到O(nlog2n),但是如果我事先对这m个数列进行随机打乱顺序,就可以采用上述方法通过本题,因此是否可以证明本算法在期望意义或随机意义下复杂度为O(nlogn)