zoukankan      html  css  js  c++  java
  • RMQ问题——ST算法

    比赛当中,常会出现RMQ问题,即求区间最大(小)值。我们该怎样解决呢?
    主要方法有线段树、ST、树状数组、splay。


    例题

    题目描述

    2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随着指挥员一声令下,长征二号F型火箭在夜空下点火起飞,神舟七号飞船载着翟志刚、刘伯明、景海鹏3位航天员,在戈壁茫茫的深邃夜空中飞向太空,开始人类漫步太空之旅。第583秒,火箭以7.5公里/秒的速度,将飞船送到近地点200公里、远地点350公里的椭圆轨道入口。而此时,火箭的燃料也消耗殆尽,即将以悲壮的方式与飞船告别。这个过程,在短短不到10分钟时间内,翟志刚和他的两名战友体会到了从超重到失重的过程。

    除了超重和失重的感觉之外,就是浩瀚的长空中璀璨的星星,和地面上看到的星星不同,在太空中看到的星星是成一条直线的,一共有N(1<=N<=100,000)颗星星,编号为1到N,每个星星有自己的体积,由于在飞船中很无聊,除了不停地玩弄手中失重的书和笔之外没有别的事可干,此时翟志刚说我们来玩游戏吧,一共玩了M轮(1<=M<=100,000),每一轮都是给出两个整数L和R(1<=L<=R<=N),询问第L到第R颗星星之间最大星星的体积,每次答对的人就可以多休息一段时间。

    由于翟志刚还要进行太空漫步,所以他现在请你帮忙,你得到的回报就是太空饼干。

    输入

    第一行输入N,M

    接下来一行N个整数,表示星星的体积(1<=体积<=maxlongint)

    接下来M行,每行两个整数L_i,R_i,表示询问区间。

    输出

    输出M行,每一行表示询问区间L_i到R_i之间最大星星的体积。

    样例输入

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

    样例输出

    7
    9
    10

    提示

    【数据说明】
    50%的数据满足1<=N,M<=5000


    这题是一个裸RMQ题,就是给你一个数列,每次求一个区间中的最大值。
    可以用ST算法做。

    ST算法

    这其实是一个DP。设f[i][j]表示以j~j+2^i-1的区间的最大值。
    初始化:f[0][j]=a[j]
    方程:f[i][j]=max(f[i-1][j],f[i-1][j+2^(i-1)])
    原因其实很好理解,就是将两个小区间合并,成为一个大区间。
    解释
    那怎么询问?
    假设询问[l,r],
    我们可以以l为起点取个最大区间,再从r为终点取个最大区间,两个区间合在一起就是[l,r]这个区间了。
    怎么取?
    设k=int(log2(r-l+1))
    那么query(l,r)=max(f[k][l],f[k][r-2^k+1])
    解释
    两个区间合起来一定是[l,r],因为它们的长度至少是[l,r]的一半(如果不到一半,它还可以扩大两倍。然而这应该是最大的区间),两边合起来一定是[l,r]。
    时间复杂度:O(NlgN+Q) Q为询问次数
    空间复杂度:O(NlgN)


    代码实现

    实现很简单,这里只写重要部分(我不会告诉你我曾是用Pascal打的,用C++打的那个是线段树)

    预处理

    for (i=1;i<=n;++i)
        f[0][i]=a[i];
    for (i=1;i<=int(log2(n));++i)
        for (j=1;j<=n-(1>>i)+1;++j)
            f[i][j]=max(f[i-1][j],f[i-1][j+(1<<i-1)]);

    询问

    int query(int l,int r)
    {
        int k=int(log2(r-l+1));
        return max(f[k][l],f[k][r-(1>>k)+1]);
    }
  • 相关阅读:
    java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)
    Java面试题集合(比较实用)
    java实现导出Excel(跨行,跨列)
    使用java类破解MyEclipse
    Oracle的导入导出 DMP 文件
    报表导出功能
    win7_oracle11g_64位连接32位PLSQL_Developer
    oralce11g导出dmp然后导入Oracle10g
    回首向来萧瑟处
    【Python】1.PyQT5界面初尝试
  • 原文地址:https://www.cnblogs.com/jz-597/p/11145309.html
Copyright © 2011-2022 走看看