RMQ(log2储存方法)


RMQ


难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B


试题描述


长度为n的数列A,以及q个询问,每次询问一段区间的最小值。


输入


第一行,一个整数n
第二行,n个数,表示A数组,用空格隔开。
第三行,一个正整数q
第4到第q+3行每行两个正整数L、R(L<=R),表示一段区间,用一个空格隔开。


输出


针对每个询问,输出结果。每个结果占一行。


输入示例


5
3 2 4 3 5
3
1 3
2 5
3 4


输出示例


2
2
3


其他说明


数据规模:n, q, Ai<=100000

 1 #include<iostream>
 2
 3 #include<cmath>
 4
 5 using namespace std;
 6
 7 int f[100010][20];
 8
 9 void rmq(int num)
10
11 {
12
13     for(int j=1;j<20;j++)
14
15         for(int i=1;i<=num;i++)
16
17             if(i+(1<<j)-1<=num)
18
19                 f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
20
21 }
22
23 int main()
24
25 {
26
27     int i,j,n,t,m;
28
29     scanf("%d",&n);
30
31     for(i=1;i<=n;i++)
32
33     {
34
35         scanf("%d",&f[i][0]);
36
37     }
38
39     rmq(n);
40
41     int s,p,maxl,minl;
42
43     cin>>m;
44
45     while(m--)
46
47     {
48
49         scanf("%d%d",&s,&p);
50
51         int k=(int)((log(p-s+1))/log(2.0));
52
53         minl=min(f[s][k],f[p-(1<<k)+1][k]);
54
55         printf("%d\n",minl);
56
57     }
58
59 }

时间: 2024-10-09 23:36:15

RMQ(log2储存方法)的相关文章

RMQ(非log2储存方法)

2016-03-31 RMQ 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 长度为n的数列A,以及q个询问,每次询问一段区间的最小值. 输入 第一行,一个整数n 第二行,n个数,表示A数组,用空格隔开. 第三行,一个正整数q 第4到第q+3行每行两个正整数L.R(L<=R),表示一段区间,用一个空格隔开. 输出 针对每个询问,输出结果.每个结果占一行. 输入示例 5 3 2 4 3 5 3 1 3 2 5 3 4 输出示

python深浅拷贝以及数据在内存中储存方法

要搞懂深浅拷贝,首先要明白数据在内存里的储存方法. 一个变量的储存,首先是变量名加上储存内容的ID,通过ID去找到变量名所对应的内容, 当我们对数据进行赋值时,其实是把内容的整体地址赋给别的变量名(相当于复制一层ID) 然而当使用浅copy时,相当于把整体内容的地址与内容中第一层地址给复制(相当于复制两层ID) 应用:直接在变量名后加一个.copy(),或import调用copy模块使用模块中的方法copy.copy() 深度拷贝,其实是复制的整体以及整体内的所有ID(复制所有层ID) 方法是用

常用集合类使用方法

在编程中,我们经常需要考虑数据的储存方法——到底用什么东西去安置这些数据呢? 一般,少的可以用数组,但是数组只能存放规定大小.同一类型的数据:这样的话,不定长的可以试试链表,但是链表检索起来需要从头到尾,一旦数据多了会很慢.如果需要为一个对象存放多个不同类型的数据,可以用结构体,制作成链表.但是在Java中,更推荐用封装类来实现,用一个类来封装这些不同数据类型的数据,然后我们只需储存.管理类对象即可.如果事先知道有多少数据的话,可以用对象数组来储存.然而,实际应用中更多是不知道有多少数据的,那该

《编写高质量JavaScript代码的68个有效方法》

第1章 让自己习惯JavaScript 第1条:了解你使用的JavaScript版本 决定你的应用程序支持JavaScript的哪些版本. 确保你使用的JavaScript的特性对于应用程序将要运行的所有环境都是支持的. 第2条:理解JavaScript的浮点数 JavaScript中的数字都是作为双精度的64位浮点数来储存的:而JavaScript的整数都仅仅是双精度浮点数的一个子集,不是单独的数据类型.而小数和小数相加有时候是不精确的,如果你用作货币计算,最好换算成最小的货币来计算. 第3条

线段树+RMQ问题第二弹

上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的方法之前,我先对 RMQ 问题的概念再一次进行说明.RMQ (Range Minimum/Maximum Query ):中文名为"区间最值查询".RMQ 问题指的是给定一段区间,针对给定区间进行若干次查询,每次给出不同的待查询子区间范围,要求返回子区间内的最大值或者最小值. RMQ 问题可以看作是线段树的一个应用

《ECMAScript 6 入门- 第四章 数值的扩展》 —— 摘抄

1. 二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b和0o表示. 0b111110111 === 503 // true 0o767 === 503 // true 八进制用0o前缀表示的方法,将要取代已经在ES5中被逐步淘汰的加前缀0的写法. 2. Number.isFinite(), Number.isNaN() ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个

数值的扩展

一.二进制和八进制表示法 1.ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 2.如果要将0b和0o前缀的字符串数值转为十进制,要使用Number方法. 二.Number.isFinite(), Number.isNaN() 1.用来检查Infinite和NaN这两个特殊值. 2.它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,非数值一律返回

ES6为数值扩展

1. 二进制和八进制表示法 ES6提供了二进制和八进制的新写法,分别用前缀0b(或0B)和0o(或0o)表示. 将0b和0o前缀的字符串数值转为十进制,要使用Number方法. Number('0b111'); //7 2. Number.isFinite(),Number.isNaN() Number.isFinite()用来检查一个数值是否为有限的(finite) Number.isNaN()用来检查一个值是否为NaN 注意:两个方法与传统的isFinite()和isNaN()方法区别在于,

ES6之路第四篇:数值的扩展

二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 1 0b111110111 === 503 // true 2 0o767 === 503 // true Number.isFinite(),Number.isNaN() ES6 在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法. Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infini