数据结构 RMQ

来源:互联网 发布:ubuntu虚拟机 编辑:程序博客网 时间:2024/05/21 08:48

学习一下 RMQ,好吧,算是dp

学习链接→ 戳这里和戳这里

poj 3264 算是模板题

RMQ,求给定区间的最值问题的,非线段树方法,DP

#include <iostream>#include <cstdio>#include <algorithm>#include <math.h>#include <cstring>using namespace std;const int maxn=50010;int a[maxn];int ma[maxn][20],mi[maxn][20];int n,q;void rmq_into(){for(int i=1;i<=n;i++)ma[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++){ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);}}} int get(int l,int r,bool mmax){int k=(int)(log(r-l+1.0)/log(2.0));if(mmax)return max(ma[l][k],ma[r-(1<<k)+1][k]);else return min(mi[l][k],mi[r-(1<<k)+1][k]);}int main(){int l,r;while(~scanf("%d%d",&n,&q)){for(int i=1;i<=n;i++)scanf("%d",&a[i]);rmq_into();for(int i=1;i<=q;i++){scanf("%d%d",&l,&r);printf("%d\n",get(l,r,1)-get(l,r,0));}}return 0;}


0 0
原创粉丝点击