UVA 11235Frequent values(RMQ)
训练指南P198
题意:给出一个非降序排列的整数数组a1, a2…… an,你的任务是对于一系列询问(i,j),回答ai, ai+1 ……aj 中出现的次数最多的次数
这题不仅学到了rmq的应用还学到了游程编码
对于一组数 -1, 1, 1, 2, 2, 2, 4就可以编码成(-1, 1), (1, 2), (2, 3), (4, 1),其中(a, b)表示 b 个连续的 a,cnt[i]表示第 i 段中数出现的次数。num[p] 表示p位置的数所在的段的标号, left[p]表示p位置的数所在段的左边那个数的下标, right[p]表示p位置的数所在段的右边那个数的下标。
那么对于查询(L, R)的结果就是下面三个中的最大的 从 L 到 L 所在段的结束出的元素(right[l] - l + 1)这里都是与L处的数相等的,然后从r所在的段开始到r处的元素的个数( r - left[r] + 1) 都是与r处相等的,然后还有中间的 (num[l] + 1, num[r] - 1)段的cnt的最大值
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
const int Max = + ;
int n, m, tot;
int num[Max], Right[Max], Left[Max], cnt[Max];
int dp[Max][];
//dp[i][j] 表示 i 段开始长度为2^j长度的区间
void RMQ_init()
{
memset(dp, , sizeof(dp));
for (int i = ; i <= tot; i++)
dp[i][] = cnt[i];
for (int j = ; ( << j) <= n; j++) // 这里的长度 是 n 是整个区间内的全部元素,
{
for (int i = ; i + ( << j) - <= tot; i++) //
{
dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - )) ][j - ]);
}
}
}
int RMQ(int l, int r)
{
if (l > r)
return ;
int k = ;
while ( << (k + ) <= (r - l + ))
k++;
return max(dp[l][k], dp[r - ( << k) + ][k]);
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
scanf("%d", &m);
memset(num, , sizeof(num));
memset(Right, , sizeof(Right));
memset(Left, , sizeof(Left));
memset(cnt, , sizeof(cnt));
int temp, last = INF;
tot = ;
for (int i = ; i <= n; i++)
{
scanf("%d", &temp);
if (temp == last) // 如果与前面的数相等
{
num[i] = tot; // 当前位置的段号不变
Right[tot]++; //当前段的右边的位置+1,
cnt[tot]++; //当前段的元素个数+1
}
else //如果不与前面的数相等则开启一个新的段
{
num[i] = ++tot; // 段号++,
cnt[tot]++;
Left[tot] = Right[tot] = i; // 当前段的左右端点都是i
last = temp; // 记录一下当前的元素
}
}
RMQ_init();
int l, r;
while (m--)
{
scanf("%d%d", &l, &r);
if (num[l] == num[r])
{
printf("%d\n", r - l + );
continue;
}
printf("%d\n", max(RMQ(num[l] + , num[r] - ), max(Right[ num[l] ] - l + , r - Left[ num[r] ] + )));
}
}
return ;
}
UVA 11235Frequent values(RMQ)的更多相关文章
- 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 Frequent Values ---RMQ
大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...
- UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)
题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...
- POJ3368Frequent values[RMQ 游程编码]
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17581 Accepted: 6346 ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- poj3368Frequent values(RMQ)
http://poj.org/problem?id=3368 追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来..然后想RMQ 想出来了 算是离散吧 把每个数出现的次数以及开始的位置及结束的位 ...
- [poj3368]Frequent values(rmq)
题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 解题关键:统计次数,转化为RMQ问题,运用st表求解,注意边界. 预处理复杂度:$O(n\log n)$ ...
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...
随机推荐
- 一位资深程序员大牛给予Java初学者的学习路线建议
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...
- iOS中NSLog输出格式大全
iOS开发中的输出格式大全: %@ 对象 %d, %i 整数%u 无符整形%f ...
- 自定义UITabBarController标签视图控制器
首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...
- mvc mvp mvvm模式的区别
mvc模式中,Model不依赖于View,但是View是依赖于Model的,m和v没有进行完全的分离,三者之间是单向的操作 mvp模式中,m和v之间的交互是双向的,m和v完全分离,m和v的交互是通过P ...
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- WPF 自定义DateControl DateTime控件
自定义日期控件,月份选择.如下是日期的一些效果图. 具体的样式.颜色可以根据下面的代码,自己调节即可 1.日期控件的界面 <UserControl x:Class="WpfApp ...
- Jquery-UI使用
=创建form对话框弹出登录 首先引入css样式和js. <link rel="stylesheet" href="<%=path%>/css/demo ...
- 《使用Hibernate开发租房系统》内部测试笔试题
笔试总结 1.在Hibernate中,以下关于主键生成器说法错误的是( C). A.increment可以用于类型为long.short或byte的主键 B.identity用于如SQL Server ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- 【repost】js 常见错误类型
1)SyntaxError SyntaxError是解析代码时发生的语法错误 // 变量名错误 var 1a; // 缺少括号 console.log 'hello'); (2)Referenc ...