基准时间限制: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. hbase的API

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.had ...

  2. Spring Boot 之 RabbitMQ 消息队列中间件的三种模式

    开门见山(文末附有消息队列的几个基本概念) 1.直接模式( Direct)模式 直白的说就是一对一,生产者对应唯一的消费者(当然同一个消费者可以开启多个服务). 虽然使用了自带的交换器(Exchang ...

  3. discover面试

    电话面 英语 20191009 面试我的是一个小姐姐,她是数据挖掘分析师,声音很甜很好听.全程英文 (1)please introduce yourself in two minutes (2)我对你 ...

  4. SpringBoot中FreeMarker创建

    1.创建SpringBoot项目时,勾选freemarker依赖(web,dev) 2.Controller中向model中存放数据 package com.ziv.springbootbygrald ...

  5. Vue路由注意事项

    一.vue中路由的使用 1.定义组件 <template> <div class="hello"> <h1 @click="info&quo ...

  6. Django密码错误报错提醒

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOwAAAIBCAYAAABKllNhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw

  7. [Web 前端] 015 css 三种元素的介绍

    1. 块元素,内联元素,内联块元素 元素就是标签 布局中常用的有三种标签 块元素 内联元素 内联块元素 1.1 块元素 也称为行元素 布局中常用的标签,如 div.p.ul.li.h1~h6.dl.d ...

  8. HardFault_Handler

    STM32程序一运行就进入HardFault_Handler,原因很可能是堆栈溢出 ]={}; // 我把程序中上面这句注释了就没事了 :进入HardFault_Handler也可能是数组越界引起的: ...

  9. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  10. Keyboarding (bfs+预处理+判重优化)

    # #10030. 「一本通 1.4 练习 2」Keyboarding [题目描述] 给定一个 $r$ 行 $c$ 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 $5 ...