基准时间限制: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. KVM/QEMU/qemu-kvm/libvirt 概念全解

    目录 目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用 前言 如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会 ...

  2. nginx的域名解析

    1.​创建域名解析结构: ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) 这里面的names是dns服务器的地址 ...

  3. 封装redis(set/get/delete)str和哈希类型

    将Redis的常用操作封装了一下: import redis class MyRedis(): def __init__(self,ip,passwd,port=6379,db=0): #构造函数 t ...

  4. exceptions: django2.2/ mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3

    在centos部署python应用后访问页面,显示如下异常信息 报错环境 python=3.6,django=2.2……django.core.exceptions.ImproperlyConfigu ...

  5. CGI 环境变量

    CGI 环境变量 环境变量 意义 SERVER_NAME CGI脚本运行时的主机名和IP地址. SERVER_SOFTWARE 你的服务器的类型如: CERN/3.0 或 NCSA/1.3. GATE ...

  6. 自己挖的坑自己填--JVM报内存溢出

    在写定时任务时,对表数据进行批量操作,测试数据有10万条左右,在测试时发现跑着跑着出现内存溢出现象,最后发现创建的对象paramList 和tmBeanList没有被回收,经过资料查找,发现是循环内不 ...

  7. CodeForces.1174D.ArraySplitting.(后缀和数组 + 贪心)

    题目链接 参考代码: #include <cstdio> #include <algorithm> using namespace std; typedef long long ...

  8. Azkaban和Oozie的区别

    Azkaban和Oozie的区别: 当前,实际生产中最流行的两种Hadoop工作流引擎是Azkaban与Oozie.但活跃度最高的当是Azkaban了,下面对两者的异同之处作如下对比. 功能对比 Az ...

  9. git恢复彻底删除的分支

    由于一时疏忽,错误的删除了未发布正式的开发分支,经查资料已恢复分支,特此记录 查看Git日志 git reflog |grep 'filter_or_gwf' 以下日志为已删除分支 filter_or ...

  10. goland使用:导入一个github开源项目tidb

    概要:在windos下的IDEA 的go语言的编辑器 goland的使用,导入github上面的开源项目. 问题: 下载好goland之后,open project打开一个下载好的githubhub项 ...