|
题目链接:uva 11235 - Frequent values
题目大意:给定一个非降序的整数数组,要求计算对于一些询问(i,j),回答ai,ai+1,…,aj中出现最多的数出现的次数。
解题思路:因为序列为非降序的,所以相同的数字肯定是靠在一起的,所以用o(n)的方法处理处每段相同数字的区间。然后对于每次询问:
- num[i]=num[j]:j?i+1
- numi≠numj:max(RMQ(righti+1,reftj?1),max(righti?i+1,j?leftj+1))
#include
#include
#include
using namespace std; const int maxn = 1e5+5; int N, Q, num[maxn], rmq[maxn][20]; int left[maxn], right[maxn]; void RMQ_init () { memset(rmq, 0, sizeof(rmq)); for (int i = 1; i <= N; i++) rmq[i][0] = right[i] - left[i] + 1; for (int j = 1; (1<
= 1; i--) { if (num[i] == num[i+1]) right[i] = right[i+1]; else right[i] = i; } RMQ_init(); } int RMQ (int L, int R) { if (L > R) return 0; int k = 0; while (1<<(k+1) <= R-L+1) k++; return max(rmq[L][k], rmq[R-(1<
|