11235 - Frequent values

给定一个非递减顺序的整数序列,对于每个查询区间[i, j],找出该区间内出现次数最多的数值并输出其出现次数。" 41724621,1509727,集合栈计算机:算法竞赛例题解析UVa 12096,"['算法', '编程', 'C++', '竞赛', '数据结构']
摘要由CSDN通过智能技术生成

11235 - Frequent values
You are given a sequence of n integers a 1 ,a 2 ,…,a n in non-decreasing order. In addition to that, you
are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the
most frequent value among the integers a i ,…,a j .
Input
The input consists of several test cases. Each test case starts with a line containing two integers n and
q (1 ≤ n,q ≤ 100000). The next line contains n integers a 1 ,…,a n (−100000 ≤ a i ≤ 100000, for each
i ∈ {1,…,n}) separated by spaces. You can assume that for each i ∈ {1,…,n − 1}: a i ≤ a i+1 . The
following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which
indicate the boundary indices for the query.
The last test case is followed by a line containing a single ‘0’.
Output
For each query, print one line with one integer: The number of occurrences of the most frequent value
within the given range.
Note: A naive algorithm may not run in time!
Sample Input
10 3
-1 -1 1 1 1 1 3 10 10 10
2 3
1 10
5 10
0
Sample Output
1
4
3

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define lowbit(x) x&(-x)
#define update add
const ll maxn=10e5+5;
int value[maxn],counts[maxn],lefts[maxn],rights[maxn],num[maxn],d[maxn][32];
/*
做题思路:
从区间左右端点削掉它们所在的区间并分别统计消掉的数的个数并判断是否在同一区间上若是则只输出r-l+1
否则判断削掉后原区间是否存在如不存在输出两者的最大值,否则查询中间区间的最大值然后输出三者最大值
value:储存原数组元素
counts:统计每个数组元的数量(对应的新索引值)
lefts:对应每一个元素(所在新索引值)的左端点
rights:右端点
num:每一个元素对应的新索引值
*/
void RMQ_init(int m)
{
   
    for(int i=1;i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值