洛谷P4168[Violet]蒲公英(算法竞赛进阶指南,分块,离散化)
发布时间
阅读量:
阅读量
算法竞赛进阶指南,第227页,分块与离散化
本题关键点:
1、首先进行离散化处理,由于编号的数值范围高达 10^9,而元素总数为 5 * 10^5,因此需要对数据进行压缩映射。
2、采用分块策略,将 n 个数值平均划分为 sqrt(n * log(n)) 段。其中 f[i][j] 表示从第 i 段到第 j 段中出现频率最高的蒲公英编号。
3、关于 f[T][T] 数组的计算方法,具体可参考代码实现部分。
4、当处理区间 [l, r] 时,该区间通常由三部分组成:中间若干完整的段 [L, R],以及左右两侧的不完整段 [l, L) 和 (R, r]。对于中间完整的段部分,可以直接通过 f[L][R] 获取出现次数最多的编号,并统计其在该区间的出现次数。随后对左右两侧的不完整段进行扫描,统计所有出现过的编号及其对应的出现次数。最终将所有统计结果中的最大值作为答案。
5、如何计算某个特定编号 x 在区间 [l, r] 中的出现次数?可在序列 e[x] 中查找第一个大于等于 l 的位置索引 lower_bound(e[x].begin(), e[x].end(), l),以及第一个大于 r 的位置索引 upper_bound(e[x].begin(), e[x].end(), r),两者的差值即为 x 在该区间内的出现次数。
#include <c
全部评论 (0)
还没有任何评论哟~
