基准时间限制: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. 002-localStorage和sessionStorage操作

    一.概述 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 一直存在除非用户手动清除缓存;是基于域的,任何该域下的所有页面都可访问localSto ...

  2. GMSSL中生成SM2或RSA1024或RSA2048的证书相关命令

    1.生成KEY:gmssl sm2 -genkey -out 01.root.pemgmssl genrsa -out 01.root_plain.key 2048gmssl genrsa -out ...

  3. [转载]X509证书中RSA公钥的提取与载入 pem key

    原地址:https://blog.csdn.net/anddy926/article/details/8940377 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等功能.在 ...

  4. window10 本地搭建SVN服务器

    window10本地搭建SVN服务器教程:https://www.cnblogs.com/warmlight/p/11075644.html 我按照这篇教程成功搭建SVN服务器. 有个比较坑的地方是w ...

  5. 使用K近邻算法改进约会网站的配对效果

    1 定义数据集导入函数 import numpy as np """ 函数说明:打开并解析文件,对数据进行分类:1 代表不喜欢,2 代表魅力一般,3 代表极具魅力 Par ...

  6. “希希敬敬对”队软件工程第九次作业-beta冲刺第二次随笔

    队名:  “希希敬敬对” 龙江腾(队长) 201810775001 杨希                   201810812008 何敬上 201810812004 今日讨论会议照片一张: 每个人 ...

  7. BZOJ 1085(IDA*)

    题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...

  8. [常用类]Number & Math 类(转载)

    下面的表中列出的是 Number & Math 类常用的一些方法: 序号 方法与描述 1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo( ...

  9. (前篇:NIO系列 推荐阅读) Java NIO 底层原理

    出处: Java NIO 底层原理 目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步 ...

  10. Gradle打包问题Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0

    前言 使用gradle打包react native的时候,出现了如下报错,下面和大家说一下解决的具体办法 Deprecated Gradle features were used in this bu ...