N个数为非递减顺序,给定范围l,r,求[l,r]区间内数字出现频率最高的次数。
可以用线段树来做。先说查询,我们设节点P对应的区间为[a, b],左孩子节点为p1,右孩子节点为p2,那么 P也许不等于 max(p1 , p2),原因是如果p1中频率较低的某个数与p2中出现频率较低的某个数是同一个数,并且两者出现次数加起来大于max(p1, p2),但是,题目说N个数为非递减顺序排列,所以这个可能只会发生在p1的右端和p2的左端对应的数是同一个数,因此,我们还要处理这第三个可能。
查询的问题解决,现在剩下的就是建立这棵线段树,这比较容易,只是在从叶子节点向根节点更新的时候有点特殊,我们只要知道当前更新的元素以及它在当前节点对应的区间内出现的次数即可,然后以最大值更新该节点,这一步,需要进行一个预处理:依次扫描N个数,对每个数出现的开始位置和结束位置进行记录即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include