https://vjudge.net/problem/UVA-11235

题意:

给出一个非降序排列的整数数组a1,a2,...,an,你的任务是对于一系列询问(i,j),回答ai,ai+1,...aj中出现次数最多的值所出现的次数。

思路:

首先对整个数组进行游程编码,比如(-1,1,1,2,2,2,4)就可以编码成(-1,1),(1,2),(2,3),(4,1),其中(a,b)表示有b个连续的a。

用count[i]表示第i段的出现次数,num[p]表示第p个数所在的段,left[i],right[i]表示第i段的左右坐标值。

 #include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = + ; int n, q, ret;
int a[maxn];
int count[maxn];
int num[maxn];
int left[maxn];
int right[maxn];
int d[maxn][]; void RMQ_init()
{
for (int i = ; i <= ret; i++)
d[i][] = ::count[i];
for (int j = ; ( << j) <= ret;j++)
for (int i = ; i + ( << j) <= ret; i++)
d[i][j] = max(d[i][j - ], d[i + ( << (j-))][j - ]);
} int RMQ(int L, int R)
{
int k = ;
while (( << (k + )) <= R - L + ) k++;
return max(d[L][k], d[R - ( << k) + ][k]);
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> n && n)
{
cin >> q;
for (int i = ; i <= n; i++)
cin >> a[i];
ret = ;
for (int i = ; i <= n; i++)
{
num[i] = ret;
::left[ret] = i;
int cnt = ;
while (a[i] == a[i + ])
{
num[i + ] = ret;
cnt++;
i++;
}
::right[ret] = i;
::count[ret] = cnt;
ret++;
}
RMQ_init();
int L, R;
int ans;
for (int i = ; i < q; i++)
{
cin >> L >> R;
int k1 = num[L];
int k2 = num[R];
ans = ;
if (k1 == k2) cout << R - L + << endl;
else if (k2 - k1 == )
{
ans = max(::right[k1] - L + , R - ::left[k2] + );
cout << ans << endl;
}
else
{
ans = max(::right[k1] - L + , R - ::left[k2] + );
ans = max(ans, RMQ(k1+, k2-));
cout << ans << endl;
}
}
}
}

UVa 11235 频繁出现的数值的更多相关文章

  1. UVA 11235 频繁出现的数值 RMQ

    题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. UVA 11235 Frequent values 线段树/RMQ

    vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...

  3. UVA 11235 (游程编码+ST算法)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题目大意:给定一个升序序列,有q次询问,每次询问(L,R) ...

  4. RMQ算法 以及UVA 11235 Frequent Values(RMQ)

    RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8)  内的最大值.数据量小 ...

  5. UVA 11235 (RMQ) 频繁出现的数值

    题目大意是给出一个非降序排列的数组,然后n个询问,每次询问一个区间内出现次数最多的数的次数. 首先要弄清楚题目的是一个非降序的数组,那么说明相等的数都会在一起,类似于11223334569这样的,那么 ...

  6. UVA 11235 Frequent values(RMQ)

    Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...

  7. Uva 11235 RMQ问题

    RMQ: 有一个不变的数组,不停的求一个区间的最小值. 使用倍增的思想优化到logN; d(i,j) 表示从 i 开始的,长度为2j的一段元素中的最小值. 那么状态转移方程: d(i,j) = min ...

  8. UVA - 11235 Frequent values

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  9. UVa 11235 RMQ

    首先讲一下RMQ算法的意思. RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]): 这里运 ...

随机推荐

  1. svn 常见问题记录

    One or more files are in a conflicted state 情景:A组员新增文件并提交,B组员更新出现如下图情况. 解决方案:直接拷贝到B组员工作区.

  2. cloudflare的NS服务器地址

    abby.ns.cloudflare.com,   alex.ns.cloudflare.com,   amy.ns.cloudflare.com,andy.ns.cloudflare.com,  a ...

  3. soft nofile

    原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2096461 写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指.到底最大文件数被什么限制了?too ...

  4. C# 拓展方法实例

    namespace BenJi{ class Program { static void Main(string[] args) { Console.WriteLine("你要调试程序吗?y ...

  5. 011-/etc/resolv.conf详解

  6. Baidu 推荐技术平台(offer)

    一面: 1 自我介绍 项目介绍. 2 RNN 原理,LSTM原理,GBDT原理,XGB与GBDT的改进. 3 多模匹配,字典树,链表环找入口. 4 c++ static 关键字 5 多线程,线程安全 ...

  7. za

    http://www.szjs.gov.cn/bsfw/zdyw_1/zfbz/jgcx/

  8. Linux下的Make命令实例详解

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.下面这 篇文章我们将用一 ...

  9. window开机启动项设置和取消方法

    window开机启动项1.添加开机启动项:开始-->所有程序-->启动-->双击(xp系统)或右键打开,把需要启动的软件快捷键拖放进去即可,遇到安全软件的拦截,只需选择 " ...

  10. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...