RMQ 模板題 poj 3264
阿新 • • 發佈:2018-09-26
while \n algo 分析 mes ring nbsp 模板 最小值
題目:點這裏
題意:給一個長度n的數列,然後又Q個詢問,問L 到R 中最大值與最小值的差。
分析:RMQ 的模板題。
代碼:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=50005; int minm,maxm; int dp_max[max_][20],dp_min[max_][20]; int a[max_]; void RMQ_init(int n) {for(int i=1;i<=n;i++) dp_max[i][0]=a[i], dp_min[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++) { dp_max[i][j]=max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]); dp_min[i][j]=min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]); } } void RMQ_Q(int L,int R) { int k=0; while((1<<(k+1))<=R-L+1)k++; minm=min(dp_min[L][k],dp_min[R+1-(1<<k)][k]); maxm=max(dp_max[L][k],dp_max[R+1-(1<<k)][k]); } int main() { int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); RMQ_init(n); while(m--) { int l,r; cin>>l>>r; RMQ_Q(l,r); printf("%d\n",maxm-minm); } }
用 cin 和cout 會超時……
RMQ 模板題 poj 3264