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. 通过Tacker将NFV引入OpenStack

    14年的这个时候,我们还在OpenStack社区中为NFV是否属于OpenStack而争论不休.如今这一争议已经被解决了.OpenStack已经成为NFV讨论中的重要部分,正如下面的ETSI MANO ...

  2. java-基础-【一】枚举

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 一.static final定义[jdk1.5之前] public static ...

  3. Java-mybatis-一次执行多条SQL语句

    mysql数据库 1.修改数据库连接参数加上allowMultiQueries=true,如: hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx: ...

  4. hiredis(Synchronous API)

    hiredis是一个小型的client端的c库.它只增加了最小对协议的支持,同时它用一个高级别的printf-alike API为了绑定各种redis命令.除了支持发送和接收命令,它还支持对流的解析. ...

  5. MVC 页面传参到另一个页面

    写法一: @{ViewData["partData"]="哇哈哈哈哈";}    @{Html.RenderPartial("~/Views/Home ...

  6. http 同步异步请求

    在用户交互模式下,当你改变表单中某个组件的值时, 譬如你填写名字.修改性别.选择爱好的时候,浏览器和服 务器至今没有发生任何交互,只有当你点击submit的时候, 浏览器才会把你的参数,也就是form ...

  7. Acrobat 无法在本页面上执行OCR识别

    下载的电子书有时不能选中,或作黄色标记,在用acrobat pro作文本识别时,报 Acrobat 无法在本页面上执行OCR识别 解决方法 参照 http://jingyan.baidu.com/ar ...

  8. Integer类之缓存

    在开始详细的说明问题之前,我们先看一段代码 1 public static void compare1(){ 2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = ...

  9. 015-awk

    1.awk的处理方式: 一次处理一行. 对每行可以进行切片处理,针对字段处理.2.awk的格式: awk BEGIN{循环之前初始化} [options] 'command' END{循环之后结尾} ...

  10. web.xml+spring mvc基本配置

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...