UVa 11235 频繁出现的数值
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 频繁出现的数值的更多相关文章
- UVA 11235 频繁出现的数值 RMQ
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- UVA 11235 (游程编码+ST算法)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题目大意:给定一个升序序列,有q次询问,每次询问(L,R) ...
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- UVA 11235 (RMQ) 频繁出现的数值
题目大意是给出一个非降序排列的数组,然后n个询问,每次询问一个区间内出现次数最多的数的次数. 首先要弄清楚题目的是一个非降序的数组,那么说明相等的数都会在一起,类似于11223334569这样的,那么 ...
- UVA 11235 Frequent values(RMQ)
Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...
- Uva 11235 RMQ问题
RMQ: 有一个不变的数组,不停的求一个区间的最小值. 使用倍增的思想优化到logN; d(i,j) 表示从 i 开始的,长度为2j的一段元素中的最小值. 那么状态转移方程: d(i,j) = min ...
- UVA - 11235 Frequent values
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- UVa 11235 RMQ
首先讲一下RMQ算法的意思. RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]): 这里运 ...
随机推荐
- Integer.valueOf方法的源码解读
public class IntegerDemo { public static void main(String[] args) { Integer i01 = ; ; Integer i03 = ...
- Andrew Ng-ML-第十九章-应用举例:照片OCR(光学字符识别)
1.问题描述与 OCR pipeline 图1.图像文字识别流水线 首先是输入图片->进行文字检测->字符分割->字符识别. 这些阶段分别需要1-5人这样子. 2.滑动窗口 主要讲滑 ...
- PHP学习必读的20本书
PHP相关<PHP程序设计>(第2版) –PHP语法和入门最好的书<PHP5权威编程> –PHP入门后升级书<深入PHP:面向对象.模式与实践>(第3版) –理解P ...
- [LeetCode] 345. Reverse Vowels of a String_Easy tag:Two Pointers
Write a function that takes a string as input and reverse only the vowels of a string. Example 1: In ...
- cocos代码研究(1)Node学习笔记
理论部分 Node类继承自Ref类,是cocos框架中基础底层的一个封装类,与画面渲染相关的类一般都是继承自该类,例如Scene,Layer,Sprite,Sprite3D,Label,SpriteB ...
- cxf的使用
java的一个rest路径包含五个部分 1.容器路径,如tomcat的文件包名,jetty的context等 2.web.xml -配置cxf或者sevlet等 3.cxf.xml 4.具体的实现类中 ...
- jquery日期时间控件
代码下载地址: jquery日期时间控件下载地址 . 工作中用到, 这里分享一下, 避免重复摸索劳动. 一. HTML 文件 <!DOCTYPE HTML PUBLIC "- ...
- tortoisegit 代码的回滚方式 --两种
TortoiseGit有两种回滚代码方式, 一种是导出指定版本代码为zip格式,不影响源代码:另一种是直接在源代码上回滚, 指定版本之后写的代码都会被删除.下面分别介绍这两种方法: 首先进入版本日志对 ...
- 应用程序无法正常启动0xc000007b怎么解决
解决方法两种: 1. 网上搜索中最常见的,缺少DirectX 9 ,去下载一个安上就OK了. 2.第二种情况比较操蛋,其实报的错误应该是:mfc100u.dll丢失 .我在两台电脑上装了相同系统后,台 ...
- linux常用命令(替换)
1. vi 模式下的替换命令: s 表示替换(substitute),g表示全局搜索(global search) :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vi ...