基准时间限制:1 秒 空间限制:131072 KB 
 收藏
 关注
给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。

 
例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)
Input
第1行:1个数N,表示序列的长度。(2 <= N <= 10000)
第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1个数Q,表示查询的数量。(2 <= Q <= 10000)
第N + 3 - N + Q + 2行:每行2个数,对应查询的起始编号i和结束编号j。(0 <= i <= j <= N - 1)
Output
共Q行,对应每一个查询区间的最大值。
Input示例
5
1
7
6
3
1
3
0 1
1 3
3 4
Output示例
7
7
3
模板题(最大):
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; const int M = 1e5;
//n序列长度
//q次询问
int n,q;
//s是存放当前点的数值
//log预处理最多跳2的v次方(使得跳2^(v+1)超出范围,跳2^(v-1)次方之后两段的长度不够n)
int s[M],log[M];
//f存放区间最大值
int f[M][]; int main()
{
//输入数据
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&s[i]);
//预处理log数组(log以2为底i的对数)
for(int i=;i<=n;i++) log[i]=log[i>>]+;
//自己往右跳一步就是自己
for(int i=;i<=n;i++) f[i][]=s[i]; for(int i=,k=;i<=log[n];i++,k*=)
{//j+k-1是当前模拟到的左区间的右端点的长度下标
for(int j=;j+k-<=n;j++)
{
f[j][i]=max(f[j][i-],f[j+k][i-]);
}
} //几组数据
scanf("%d",&q);
//跳的2的几次方
int len;
//左右端点
int a,b;
//记录答案
int ans;
for(int i=;i<=q;i++)
{
scanf("%d%d",&a,&b);
a++,b++;//因为题目中数据是从0开始的,而我写的是从1开始的
//+1的原因是因为右端点坐标减去左端点坐标得到的数不是该区间点的个数,可以自己画个图意会一下...
len=log[b-a+];
//减区间分为两段后,在其中找出的最大值就是该区间的最大值
//1<<len就是2^len (减去2^len之后在图上多减去了一个点,将这个点加上,即为第二段的开始起点)
ans=max(f[a][len],f[b-(<<len)+][len]);
printf("%d\n",ans);
} return ;
}
    • 120通过
    • 224提交
  • 题目提供者ws_ly
  • 标签云端
  • 难度普及/提高-
  • 时空限制1s / 128MB

题目背景

题目描述

为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, A2, ... Am},以及第2至第M + 1件的Q[m + 1], Q[m + 2] ... 最后统计第N - M + 1至第N件的Q[n]。根据Q再做进一步评估。

请你尽快求出Q序列。

输入输出格式

输入格式:

输入共两行。

第一行共两个数N、M,由空格隔开。含义如前述。

第二行共N个数,表示N件产品的质量。

输出格式:

输出共N - M + 1行。

第1至N - M + 1行每行一个数,第i行的数Q[i + M - 1]。含义如前述。

输入输出样例

输入样例#1:

10 4
16 5 6 9 5 13 14 20 8 12
输出样例#1:

5
5
5
5
5
8
8

说明

[数据范围]

30%的数据,N <= 1000

100%的数据,N <= 100000

100%的数据,M <= N, A <= 1 000 000

模板题(最小):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; const int M = ;
int n,m;
int a[M];//保存数
int f[M][];//f[i][j]表示第i个数向后 2的j次方 个数取得的最小值 int main()
{
cin>>n>>m;
for(int i=;i<=n;++i) cin>>a[i];
for(int i=;i<=n;++i) f[i][]=a[i];
for(int j=;j<=;++j)
for(int i=;i<=n;++i)
if(i+(<<j)-<=n)
f[i][j]=min(f[i][j-],f[i+(<<(j-))][j-]);//RMQ初始化
int i,j;
for(int x=;x<=n-m+;++x)
{
i=x,j=x+m-;
int k=log(j-i+)/log();
cout<<min(f[i][k],f[j-(<<k)+][k])<<endl;
}
return ;
}

cogs495. 窗口

★☆   输入文件:window.in   输出文件:window.out   简单对比
时间限制:2 s   内存限制:256 MB

【问题描述】

给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:

Window position Min value Max value
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5]3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7 ] 3 7

你的任务是找出窗口在各位置时的max value,min value.

输入格式:

第一行n,k,第二行为长度为n的数组

输出格式:

第一行每个位置的min value,第二行每个位置的max value

样例

window.in
8 3
1 3 -1 -3 5 3 6 7

window.out
-1 -3 -3 -3 3 3
3 3 5 5 6 7

数据范围:

20%:n≤500; 50%:n≤100000;
100%:n≤1000000;

 思路:

  1)RMQ求最小+最大值

  2)单调队列(是真心的不会。。。)

坑点:

  写RMQ的时候要预处理到2的20次方,不然会WA

上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std; const int M = ;
int n,k,x,y;
int a[M];//保存数
int f1[M][];//f[i][j]表示第i个数向后 2的j次方 个数取得的最小值
int f2[M][],Maxx[M];//最大值 int main()
{
freopen("window.in","r",stdin);
freopen("window.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=;i<=n;++i) cin>>a[i];
for(int i=;i<=n;++i) f1[i][]=f2[i][]=a[i];
for(int j=;j<=;++j)
for(int i=;i<=n;++i)
if(i+(<<j)-<=n)
f1[i][j]=min(f1[i][j-],f1[i+(<<(j-))][j-]),//RMQ初始化
f2[i][j]=max(f2[i][j-],f2[i+(<<(j-))][j-]);
for(int i=;i<=n-k+;++i)
{
x=i,y=i+k-;
int k=log(y-x+)/log();
cout<<min(f1[x][k],f1[y-(<<k)+][k])<<" ";
Maxx[i]=max(f2[x][k],f2[y-(<<k)+][k]);
}
cout<<endl;
for(int i=;i<=n-k+;++i)
cout<<Maxx[i]<<" ";
return ;
}

End.

【テンプレート】RMQ的更多相关文章

  1. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

  2. 【bzoj3339】Rmq Problem

    [bzoj3339]Rmq Problem   Description Input Output Sample Input 7 50 2 1 0 1 3 21 32 31 43 62 7 Sample ...

  3. 【&】位与运算符【|】位或运算符之权限控制算法

    [&]位与运算符: 按位与运算符"&"是双目运算符. 其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数 ...

  4. 存储过程 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果

    use TTgoif exists (select * from sysobjects where name='Tonge')drop table Tongecreate table Tonge( I ...

  5. 普通方式 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果

    首现创建一张表,然后插入1000+万条数据,接下来进行测试. use TTgoif exists (select * from sysobjects where name='Tonge')drop t ...

  6. java byte【】数组与文件读写(增加新功能)

    今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: ...

  7. Spring 当 @PathVariable 遇上 【. # /】等特殊字符

    @PathVariable注解应该不是新鲜东西了Spring3.0就开始有了 URL中通过加占位符把参数传向后台 举个栗子,如下比较要说的内容比较简单就大概齐的写一下 画面侧 $.ajax({ typ ...

  8. 【php正则】php正则匹配UTF-8格式的中文汉字 和 【,】【,】【。】等符号

    1.php正则匹配UTF-8格式的中文汉字 和 [,][,][.]等符号 if (preg_match_all("/([\x{4e00}-\x{9fa5}]+((,)?)+((,)?)+(( ...

  9. 公式中表达单个双引号【"】和空值【""】的方法及说明

    http://club.excelhome.net/thread-661904-1-1.html 有人问为什么不用三个双引号"""来表示单个双引号["]呢,如果 ...

随机推荐

  1. redis和memcached的对比与选型

    相似处:     1:Memcached与Redis都属于内存内.键值数据存储方案.均属于NoSQL家族,而且都基于同样的键值数据模型.双方都选择将全部数据保存在内存当中,这自然也就让它们成为非常理想 ...

  2. Vue Router:使用 props 将组件和路由解耦

    在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...

  3. 编程字体Source Code Pro 免费下载

    对于程序员来说,好的字体应该满足的基本条件: 字母和数字易于分辨,如: 英文字母o 和 阿拉伯数字 0 ,或者 英文字母 l 和 阿拉伯数字 1 ,两个单引号 '' 和双引号 ”. 字体等宽,保持对齐 ...

  4. python函数及调用

    python的函数是一段重复多次可调用的代码,依据python的函数,我们可以利用函数式的编程,来减少代码的重复. 在本章节中,详细的介绍python的函数,以及python的函数式编程的与众不同,函 ...

  5. 阅读笔记12-Java 面试题 —— 老田的蚂蚁金服面试经历

    电话一面 1.自我介绍.自己做的项目和技术领域 2.项目中的监控:那个监控指标常见的哪些? 3.微服务涉及到的技术以及需要注意的问题有哪些? 4.注册中心你了解了哪些? 5.consul 的可靠性你了 ...

  6. python绘制五角星

    问题描述: python中运用turtle图形模块绘制五角星 问题分析: turtle绘制图形时,得知图形中重要点的坐标非常重要. 于是,绘制五角星问题转化成为一个数学问题,计算五个顶点坐标即可. 已 ...

  7. Java基础/利用fastjson反序列化json为对象和对象数组

    利用fastjson反序列化json为对象和对象数组 利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List fastjson 是一个性能很好的 ...

  8. chineseocr项目的配置阶段出现的问题及解决方案

    chineseocr为GitHub上的一个开源项目,主要使用yolos,crnn等深度学习框架训练好后的模型使用.测试结果发现,不管是针对文本文件.表格文件.还是场景图,如身份证火车票,识别效果都比较 ...

  9. Windows7无法删除EFI分区解决办法

    Windows7无法删除第二块儿硬盘的EFI分区的解决办法: 1.Win+R,diskpart. 2.在命令行中输入list disk 命令. 发现本机有两块儿磁盘,我们需要删除的EFI分区在磁盘1中 ...

  10. 数组方法之reduce实践

    Array.prototype.reduce let arr = [1, 2, 3, 4], sum = arr.reduce((prev, curr, index, arr) => { ret ...