rmq模板
Posted Arlenmbx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rmq模板相关的知识,希望对你有一定的参考价值。
#include<stdio.h> #include<iostream> #include<math.h> #include<string.h> using namespace std; const int MAXN=50050; int dpmax[MAXN][20]; int dpmin[MAXN][20]; void makeMaxRmq(int n,int b[]) { for(int i=0;i<n;i++) dpmax[i][0]=b[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++) dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]); } int getMax(int u,int v) { int k=(int)(log(v-u+1.0)/log(2.0)); return max(dpmax[u][k],dpmax[v-(1<<k)+1][k]); } void makeMinRmq(int n,int b[]) { for(int i=0;i<n;i++) dpmin[i][0]=b[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++) dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]); } int getMin(int u,int v) { int k=(int)(log(v-u+1.0)/log(2.0)); return min(dpmin[u][k],dpmin[v-(1<<k)+1][k]); } int a[MAXN]; int main() { int n,Q; int u,v; while(scanf("%d%d",&n,&Q)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); makeMaxRmq(n,a); makeMinRmq(n,a); while(Q--) { scanf("%d%d",&u,&v); u--; v--; int t1=getMax(u,v); int t2=getMin(u,v); printf("%d\n",t1-t2); } } return 0; }
以上是关于rmq模板的主要内容,如果未能解决你的问题,请参考以下文章