RMQ 的入门 hdu1806
RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值。
这个有很多算法:这里介绍一种比较高效的ST算法解决这个问题。ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。
令dp(i,j)表示从 i 开始的,长度为 2^j 的一段中元素的最小值,即可以递推出dp(i,j)=min(dp(i,j-1),dp(i+2^(j-1) , j-1))。
代码:
void ST(int n) {
for (int i = ; i <= n; i++)
dp[i][] = A[i];
for (int j = ; ( << j) <= n; j++) {
for (int i = ; i + ( << j) - <= n; i++) {
dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - ))][j - ]);
}
}
}
int RMQ(int l, int r) {
int k = ;
while (( << (k + )) <= r - l + ) k++;
return max(dp[l][k], dp[r - ( << k) + ][k]);//int k=(int)(log(double(R-L+1))/log(2.0));
}
查询是把区间分两块,比较得结果。
题目:点这里。
题意:给出一个非降序的整数数组,你的任务是对于一系列询问,回答区间内出现最多的值的次数。
分析: 非降序,就是说相同的数会连续出现,即就可以对其分块,相同的数为一块,记录块的长度,左右节点。然后就可以分成三部分,L在的块,R在的块,中间的所有块,找出中间的最长块,L,R 在的块的残缺值比较,就可以了,中间的找最长块就用ST算法。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const int max_=1e5+;
int dp[max_][];//RMQ的数组
int a[max_];//原数组。
int coun[max_];//分段数组
using namespace std;
void RMQ_init(int t)//初始化+递推
{
for(int i=;i<t;i++)
dp[i][]=coun[i];
for(int j=;(<<j)<t;j++)
for(int i=;i+(<<j)-<t;i++)
{
dp[i][j]=max(dp[i][j-],dp[i+(<<(j-))][j-]);//int k=(int)(log(double(R-L+1))/log(2.0));
}
}
int RMQ_Q(int l,int r)//RMQ的查询
{
if(l>r)
return ;//中间这块为0。
else {
int k=;
while((<<k+)<=r-l+)k++;
return max(dp[l][k],dp[r-(<<k)+][k]);
}
} int main()
{
int n;
while(cin>>n)
{
if(n==)
break;
int m; int right[max_],left[max_],num[max_];//每个段的左右端点,编号。
int a[max_];
cin>>m;
for(int i=;i<=n;i++)
{
cin>>a[i];
}
int k=,l=,t=;//,每段长度,段数
for(int i=;i<=n;i++)
{
num[i]=t;//编号
if(a[i]==a[i+])
{
k++;//长度+1;
}
else
{
right[t]=i;//更新右端点
left[t]=l;//更新左端点
l=i+;
coun[t]=k;//记录段的长度
k=;
t=t+;
}
}
// cout<<t<<endl;
RMQ_init(t);
while(m--)
{
int l,r;
cin>>l>>r;
if(num[l]==num[r])//在同一块时。
{
cout<<r-l+<<endl;
continue;
}
else//分三块。
{
int L=num[l]+;
int R=num[r]-;
int temp=RMQ_Q(L,R);
int res=max(right[L-]-l+,max(temp,r-left[R+]+));//三块比较。
cout<<res<<endl;
}
}
}
} 超时,要改成scanf 和printf……
RMQ 的入门 hdu1806的更多相关文章
- poj 1330(RMQ&LCA入门题)
传送门:Problem 1330 https://www.cnblogs.com/violet-acmer/p/9686774.html 参考资料: http://dongxicheng.org/st ...
- RMQ LAC 入门
RMQ RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大) ...
- RMQ 算法入门
1. 概述 RMQ(Range Minimum/Maximum Query).即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
- RabbitMQ学习之:(一)初识、概念及心得
因为网上有一篇很好的RMQ的入门帖子http://lostechies.com/derekgreer/tag/rabbitmq/,所以我就不多说了,就说说我目前看了该作者1~5章后,自己的心得.(所以 ...
- hdu 1754:I Hate It(线段树,入门题,RMQ问题)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- RMQ入门
注:为方便描述算法 便于记忆 所以ST的代码用Pascal书写 见谅 RMQ,即Range Minimum/Maximum Query问题,给定一个区间,询问不同子区间的最值问题. 当询问次数较少时, ...
- RMQ入门解析
参照大佬博客:https://www.cnblogs.com/yoke/p/6949838.html RMQ(Range Minimum/Maximum Query), 是一种问题,即 查询给定区间 ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
随机推荐
- App 区别
本文的结构主要分为以下部分: 1.app的分类 2.每类app的定义,明确各类app具体是什么 3.各类app的优缺点 4.具体开发过程中,到底该采用哪种类型的app 1.app的分类 大致可以分为这 ...
- SpringCloud学习系列-微服务
最近和尚硅谷周阳老师学习了Spring Cloud感觉有必要在这里做下笔记和总结. 软件系统架构演变 单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用 ...
- 决策树剪枝算法-悲观剪枝算法(PEP)
前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...
- 【leetcode】1156. Swap For Longest Repeated Character Substring
题目如下: Given a string text, we are allowed to swap two of the characters in the string. Find the leng ...
- 【微信小程序】使用vscode编写微信小程序项目
1. 在微信开发者工具(以下简称:开发者)中新建一个模板微信小程序 2. 在开发者中将模拟器分隔开 3. 设置在保存时编译 4. 在vscode中打开项目目录 5. 下载代码提示插件 这样就可以在vs ...
- React Native 之项目的启动
运行项目有两种方法 1. 到根目录,执行 react-native run-ios 命令 会开启一个本地服务,加载jsbundle文件,然后是去index.js文件 import {AppRegist ...
- PHP入门培训教程 PHP变量的使用
很多朋友在编写PHP程序的时候有时候对变量总有着不能确定的问题,而且也有很多问题就是因为变量的处理不当所造成的.这里兄弟连PHP培训 小编,就PHP变量系统说一下. PHP的变量分为全局变量与局部 ...
- POJ 3061 Subsequence ( 二分 || 尺取法 )
题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...
- spring学习笔记之---JDBC Template
JDBC Template(简化持久化操作) (一)创建项目 (1)Maven配置 <dependencies> <dependency> <groupId>ju ...
- 判断内网机器的真实外网IP或域名的方法总结
在内渗透中有时需要在某台WEB服务器中留下后门,可以通过内网IP建立IPC连接,但还需要获知外网IP才能访问Wbshell,在无网关权限的情况下,我总结了有如下方法: nslookup myip.op ...