Description

给定一个数组,其中的元素满足非递减顺序。任意给定一个区间[i,j],求其中某个元素重复出现的最大次数。

Input

多组数据输入。每组数据的第一行包含两个整数n和q(1<=n,q<=100000),下一行包含n个整数a1,…,an(-100000<=ai<=100000,i∈{1,…,n}),用空格分隔,数列是升序的(ai<=ai+1)。接下来的q行,每行包含两个整数i和j(1<=i<=j<=n),表示给定区间[i,j]。

输入结束于0(自成一行)。

Output

对输入的q个区间,每个区间输出一个整数表示该区间内重复最多的元素出现的次数,用换行分隔。

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

【题目链接】:http://oj.acmclub.cn/problem.php?cid=1162&pid=4

【题意】

【题解】



构造一个数组b;

if(a[i]==a[i-1])
b[i] = b[i-1]+1;
else
b[i] = 1;

这个b数组

就表示第i个数字前面有多少个连续数字是和它相等的;

这样对于每一个区间L,R

除了最左端的b[L]以及右端的连续的a[i]==a[L]的位置不能肯定就一定有B[L]个以外,其他的都能确定出现次数最多的就是b的最大值;

这里可以再O(N)求出从该位置开始往后连续的有多少长度和这个位置的a[i]相同;设为dp[i]

则一开始令t=min(dp[L],R-L+1),L=L+dp[i];

然后取【L,R】中的b的最大值和t取较大值作为答案;(L>R的话,答案就是t)



【Number Of WA】



1



【完整代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = 1e5;
int n, q;
int a[N+5], b[N+5], mx[N<<2],dp[N+5];
void build(int l,int r,int rt)
{
if(l==r)
{
mx[rt] = b[l];
return ;
}
int m = (l+r)>>1;
build(lson);
build(rson);
mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
return mx[rt];
int m = (l+r)>>1;
int ans = 1;
if(L<=m)
ans = max(ans,query(L,R,lson));
if(R>m)
ans = max(ans,query(L,R,rson));
return ans;
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
//ios::sync_with_stdio(false);
while(scanf("%d",&n)!=EOF)
{
if (n==0) break;
scanf("%d",&q);
a[0] = -1e7;
memset(b,0,sizeof(b));
for(int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
if(a[i]==a[i-1])
b[i] = b[i-1]+1;
else
b[i] = 1;
}
dp[n] = 1;
for (int i = n-1;i >= 1;i--)
if (a[i+1]==a[i]){
dp[i] = dp[i+1]+1;
}
else
dp[i] = 1;
build(1,n,1);
while(q--)
{
int L,R;
scanf("%d%d",&L,&R);
int t=0;
t = min(dp[L],R-L+1);
L = L + t;
if(L>R)
printf("%d\n",t);
else
printf("%d\n",max(t,query(L,R,1,n,1)));
}
}
}

【图灵杯 E也即POJ 3368】简单的RMQ的更多相关文章

  1. poj 3368 Frequent values(RMQ)

    /************************************************************ 题目: Frequent values(poj 3368) 链接: http ...

  2. POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)

    题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...

  3. POJ 3368 Frequent values RMQ 训练指南 好题

    #include<cstdio> #include<cstring> ; const int inf=0x3f3f3f3f; inline int max(int x,int ...

  4. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  5. 图灵杯 E 简单的RMQ(UVA 11235)(RMQ)

    E: 简单的RMQ 时间限制: 2 Sec  内存限制: 64 MB提交: 934  解决: 165[提交][状态][讨论版] 题目描述 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i, ...

  6. Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)A蔡老板的会议

    题目描述 图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会.综合楼有N (1<=N<=1000)间办公室,编号1~N每个办公室有一个部长在工(mo)作(yu),其中X号是蔡老板的办 ...

  7. POJ 3368 RMQ-ST

    一直感觉RMQ水,没自己写过,今天写了一道题,算是完全独立写的,这感觉好久没有了... 一直以来,都是为了亚洲赛学算法,出现了几个问题: 1.学的其实只是怎么用算法,对算法的正确性没有好好理解,或者说 ...

  8. (简单) POJ 3368 Frequent values,RMQ。

    Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...

  9. 【图灵杯 J】简单的变位词

    Description 变位词是指改变某个词的字母顺序后构成的新词.蔡老板最近沉迷研究变位词并给你扔了一道题: 给你一些单词,让你把里面的变位词分组找出来.互为变位词的归为一组,最后输出含有变位词最多 ...

随机推荐

  1. 笔记本安装Archlinux笔记

    同步更新于wendster大佬的个人博客 搬运自我的洛谷博客 可能会不定期更新! 因为前几天给我的小炸鸡加了一根内存条:而且先前装的Xubuntu是32位的,使用极其不方便:再加上wendster大佬 ...

  2. linux查看前几条命令记录

    1.按上下箭头键2.history|more分页显示3.vi /etc/profile找HISTSIZE=1000,说明你最多能存1000条历史记录.4.!!执行最近执行的命令5.history|he ...

  3. ES6特性:(阮一峰老师)学习总结

    ES6(阮一峰)学习总结   1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域. { var a = 5; let b = 6; } con ...

  4. SQL SERVER-集合操作

    内连接      INNER JOIN(等值连接):只显示两个表中联结字段相等的行.这个和用select查询多表是一样的效果,所以很少用到:外连接:LEFT JOIN :以左表为基础,显示左表中的所有 ...

  5. 关于amd64和ia64的理解

    关于amd64和ia64的理解 学习了:http://blog.csdn.net/zubin006/article/details/5060383 IA64指的是Intel安腾系列CPU,不是X86架 ...

  6. cocos2d-x3.2 下使用多线程

    事实上在cocos2dx下使用多线程事实上就是用C++去写,这里提供几个简单的样例: 原文地址:http://blog.csdn.net/qqmcy/article/details/36227377 ...

  7. 号外:Spark 1.3.0公布了,快来一起飞!

    Spark 1.3.0 Release Note Spark 1.3.0在上周五正式公布.真是千呼万唤始出来.本次公布最大的惊喜就是DataFrame.另外一个值得关注的是Spark SQL从Alph ...

  8. Flutter 1.5 发布,正式成为全平台 UI 框架!

    一. 序 在 Google I/O 2019 上,Dart 团队宣布推出新的 Flutter 稳定版本 1.5,这是 Flutter 迄今为止最大的一次版本发布. 伴随着 Flutter 1.5 的发 ...

  9. world 替换+正则表达式命令

    打开替换命令,点击“更多”,勾选上“通配符”,正则表达式才会起作用

  10. Android 6.0 开发人员对系统权限的使用与练习(Permissions Best Practices)

    Permissions Best Practices 在安装的过程中,用户非常easy忽略权限请求. 假设一个用户相应用感觉沮丧或者操心泄漏个人信息,那么这些用户就会不用他或者卸载它. 怎样规避这个问 ...