区间问题三部曲(1) : 在线区间最值算法

本文介绍了在线区间最值问题,以一个财主和管家的故事为背景,提出了区间最值查询的问题。文章通过暴力法指出其时间复杂度问题,并引入ST算法作为解决方案。ST算法通过预处理构建dp数组,实现区间最小值的快速查询。文章还给出了算法的代码实现,并解释了其查询过程,最后预告了动态区间和问题。
摘要由CSDN通过智能技术生成

区间问题是常见的统计问题之一,广泛应用于各类问题之中。主要形式有区间最值问题,区间和问题等。而区间最值问题可以分为静态区间最值和动态区间最值。我们先看一个情景:


描述

老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。

输入格式

输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。
第二行为m个数,分别是账目的钱数
后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。

输出格式

输出文件中为每个问题的答案。具体查看样例。

测试样例1

输入

10 3 
1 2 3 4 5 6 7 8 9 10 
2 7 
3 9 
1 10

输出

2 3 1

最好想的方法就是暴力法,每次询问就过一遍区间找最小值,复杂度O(n^2),对于100000数据量显然难以胜任。而如果开一个100000*100000的数组做优化空间又吃不消。所以我们需要ST算法来解决这个问题。
我们用这道题来解释ST算法的运行。

(1) 预处理

预处理使用一个数组dp[0..n][log(n)+1]的数组,使dp[i][j]为从i开始(包括i)之后2^j个数字中的最小值。具体方法使用动态规划。

首先 dp[i][0] = a[i], 即从i开始后一个中的最小值为第i个数(自己嘛)
对于样例就是这样的
这里写图片描述

然后 对于dp[j][i],一定有dp[j][i] = min(dp[j][i-1],dp[j+2^(j-1)][i-1])

我们来证明他:dp[j][i-1]记录着j..j+2^(i-1)-1中的最小值, dp[j+2^(j-1)][i-1]则记录了j+2^(i-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值