题目传送门
题目大意:
给出一个非降序排列的整数数组a1,a2,a3,...an,你的任务是对于一系列询问(i,j),回答a[i],a[i+1],...a[j]中出现次数最多的值所出现的次数。
解题思路:
整个数组是非降序的,所有相等元素都会聚集到一起。这样就可以把整个数组进行游程编码,把整个数组分成若干段,用sum[i]表示第i段的数出现的次数,num[p],lft[p],rig[p],分别表示位置p所在段的编号和左右端点的位置。每次查询(L,R)的结果为以下3个部分的最大值:
- 从L到L所在段的右端点的元素个数(即rig[L]-L+1)
- 从R所在段的左端点到R的元素个数(即R-lft[R]+1)
- 中间第num[L]+1段到第num[R]-1段的sum的最小值
特殊情况,如果L和R在同一段中,则答案是R-L+1。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include