基准时间限制: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. 手把手教您在 Windows Server 2019 上使用 Docker

    配置 Windows 功能 要运行容器,您还需要启用容器功能 Install-WindowsFeature -Name Containers 在 Window Server 2019 上安装 Dock ...

  2. C 语言跟 C++ 的差异比较

    C++ 完整的 CHM 版离线手册,可以 从这里下载. C++头文件不必是 .h 结尾 C语言中的标准库头文件,例如 math.h 和 stdio.h,在C++中被命名为 cmath 和 cstdio ...

  3. c# 解决Socket问题——由于目标机器积极拒绝,无法连接

    关于单机出现这种问题不多赘述,主要阐述服务机和客户机出现这种问题的解决办法. 1.检查防火墙 这种问题出现的最多,特别是你的服务机还是买的各家的云产品,比如阿里云就是到防火墙中添加出入站规则,Azur ...

  4. Java 基础知识整理 (待整理)

    JVM之类加载器(ClassLoader)基本介绍 类加载器用于将class文件加载到JVM中去执行.下面介绍类加载器涉及到的基本概念和加载基本过程. 一.Java虚拟机与程序的生命周期 在运行Jav ...

  5. django shell的基本使用

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke/ 在日常工作再发中,经常需要测试一些对象.函数.类...等是否正确,但是如果整体运行项目特别麻烦,并且 ...

  6. POJ-2456.Aggressivecows.(二分求解最大化最小值)

    本题大意:在坐标轴上有n个点,现在打算在这n个点上建立c个牛棚,由于牛对厂主的分配方式表示很不满意,它很暴躁,所以它会攻击离它很近的牛来获得快感,这件事让厂主大大知道了,他怎么可能容忍?所以他决定有策 ...

  7. JDK11 | 第二篇 : JShell 工具

    文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/saHBSTo4OjsIIqv_ixigjg 一.简介 Java Shell工具是JDK1. ...

  8. 三大浏览器(火狐-谷歌-IE浏览器)驱动版本下载

    1.chrome浏览器: 对于chrome浏览器,有时候会有闪退的情况,有时候也许是版本冲突的问题,我们要对照着这个表来对照查看是不是webdriver和chrome版本不对应 点击下载chrome的 ...

  9. Tornado 的核是什么??

    Tornado 的核心是 ioloop 和 iostream 这两个模块,前者提供了一个高效的 I/O 事件循环,后 者则封装了 一个无阻塞的 socket .通过向 ioloop 中添加网络 I/O ...

  10. 【Matlab技巧】工作区变量如何添加到Simulink中?

    对新手来说,在进行simulink仿真时想把工作区的变量添加到Simulink中,这样在如transfer模块中使用时可以直接输变量即可. 如这样: 那么如何对Simulink仿真文件自动赋值呢? 1 ...