这个题意思就是处理区间众数,区间想到只有线段树,但是线段树做不了一点,所以考虑暴力其他数据结构。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里引入一个思想叫做分块,把数列分成一块一块,然后分别维护每块中间的信息。
对于修改,直接修改区间中整块内和散块的信息(虽然这题没有)。对于查询,就直接可以处理整块信息,然后再处理散块信息。
没错,就是这个非常暴力的思想。一般块长开到 n\sqrt{n}n ,这样过线段树模板题,时间复杂度 O(nn)O(n \sqrt{n})O(nn )。
分块可以支持动态的,但对于本题是静态问题分块可以支持的就更多了。就比如这个区间众数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
先考虑对于一个区间众数有可能是哪些数。
可能是区间整块内的数的众数(这个可以预处理),也可能是块外的数。
我们预处理 d[i][j] 表示 i 块到 j 块内的众数,和 sm[i][j] 表示前 i 个块内 j 出现了几次。
这两个可以 O(nn)O(n \sqrt{n})O(nn ) 预处理的,直接扫一遍就可以了。
然后呢?查询就直接暴力扫一遍块外的数,然后记录每一种数出现次数,和区间内众数出现比较,那个大哪个就是答案。
代码:
然后就没了。