关闭

st算法-延绵的山峰

171人阅读 评论(0) 收藏 举报
分类:

st算法中的动态规划还不是完全理解,但是,就是因为这两个代码:

以下的文字:百度百科也讲的挺不错的
首先是预处理,用一个DP解决。设a[i]是要求区间最值的数列,f[i,j]表示从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7 ,f[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。f[1,2]=5,f[1,3]=8,f[2,0]=2,f[2,1]=4……从这里可以看出f[i,0]其实就等于a[i]。这样,Dp的状态、初值都已经有了,剩下的就是状态转移方程。我们把f[i,j]平均分成两段(因为f[i,j]一定是偶数个数字),从i到i+2^(j-1)-1为一段,i+2^(j-1)到i+2^j-1为一段(长度都为2^(j-1))。用上例说明,当i=1,j=3时就是3,2,4,5 和 6,8,1,2这两段。f[i,j]就是这两段的最大值中的最大值。于是我们得到了动规方程
F[i,j]=max(F[i,j-1],F[i+2^(j-i),j-1]).

void rmq_isit(bool ok)  
{  
    for(int i=1;i<=n;i++)  
        mm[i][0]=mi[i][0]=a[i];  
    for(int j=1;(1<<j)<=n;j++)  
    {  
        for(int i=1;i+(1<<j)-1<=n;i++)  
        {  
            if(ok)  
                mm[i][j]=max(mm[i][j-1],mm[i+(1<<(j-1))][j-1]);  
            else  
                mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);  
        }  

    }  
}  

如果不是全部二分,也不用怕,最后在来一次比较,即求交叉部分。
那么查询的时候对于任意一个区间 l – r ,我们同样可以得到区间差值 len = (r - l + 1)。
那么我们这一用小于2^k<=len,的 k 把区间分成可以交叉的两部分l 到 l+2^(k)- 1, 到 r -(1<

int rmq(int l,int r)  
{  
    int k=0;  
    while((1<<(k+1))<=r-l+1)  
        k++;  
    //printf("%d %d %d %d\n",l,l+(1<<k),r-(1<<k)+1,r-(1<<k)+1+(1<<k));  
    int ans1=max(mm[l][k],mm[r-(1<<k)+1][k]);  
    //交叉部分
    int ans2=min(mi[l][k],mi[r-(1<<k)+1][k]);  
    return ans1-ans2;  
}  
0
0
查看评论

【cogs58】延绵的山峰【st表】

问题描述   有一座延绵不断、跌宕起伏的山,最低处海拔为0,最高处海拔不超过8848米,从这座山的一端走到另一端的过程中,每走1米海拔就升高或降低1米。有Q个登山队计划在这座山的不同区段登山,当他们攀到各自区段的最高峰时,就会插上队旗。请你写一个程序找出他们插旗的高度。  ...
  • sunshinezff
  • sunshinezff
  • 2015-07-27 17:06
  • 753

Cogs 58. 延绵的山峰(st表)

延绵的山峰 ★★☆ 输入文件:climb.in 输出文件:climb.out 简单对比 时间限制:1 s 内存限制:512 MB 问题描述 有一座延绵不断、跌宕起伏的山,最低处海拔为0,最高处海拔不超过8848米,从这座山的一端走到另一端的过程中,每走1米海拔...
  • sinat_34550050
  • sinat_34550050
  • 2017-02-05 09:07
  • 104

matlab三维山峰/山脉/山地曲面数据图

matlab三维山峰/山脉/山地曲面数据图可以使用peaks函数。比如直接peaks(80):peaks(80) z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
  • zhangphil
  • zhangphil
  • 2017-12-15 14:22
  • 701

SDUT-山峰

山峰 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 金石山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3,...
  • wzy_2017
  • wzy_2017
  • 2017-08-02 16:45
  • 94

ST算法(Sparse Table)

转自飘过的小牛:http://blog.csdn.net/niushuai666/article/details/6624672 1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问...
  • David_Jett
  • David_Jett
  • 2015-07-21 19:15
  • 1152

CODEVS-1531 山峰

题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。每个山峰的高度都是不一样的。编号为i的山峰高度为hi。 小修从西往东登山。每到一座山峰,她就回头观望自己走过的艰辛历程。在第i座山...
  • u012773338
  • u012773338
  • 2014-10-17 17:20
  • 657

理解RMQ问题和ST算法的原理

1.RMQ问题     RMQ (Range Minimum/Maximum Query):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,jRMQ问题是指求区间最值的问题。最简单的方法,就是遍历数组直接搜索,但是这种方式时间复杂度是O(n)。对于数组长度较大,性能...
  • aitangyong
  • aitangyong
  • 2014-05-25 13:16
  • 1187

codecombat安息之云山峰41关代码分享

codecombat中国游戏网址:http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41、Summit's Gate //需要一个好的操作 // F...
  • hqj_email
  • hqj_email
  • 2015-09-14 00:02
  • 706

求解区间最值的ST算法

作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1。 方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1))。虽然还可以使用线段树、树状链表等求解区间最值,但是ST算...
  • insistGoGo
  • insistGoGo
  • 2013-08-12 18:24
  • 4799

sdut oj 3661山峰

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 金石山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。编号为i的山峰高度为hi...
  • zbspy_ZJF
  • zbspy_ZJF
  • 2017-07-24 20:04
  • 210
    个人资料
    • 访问:11395次
    • 积分:688
    • 等级:
    • 排名:千里之外
    • 原创:56篇
    • 转载:18篇
    • 译文:0篇
    • 评论:0条