1. 程式人生 > >RMQ 模板題 poj 3264

RMQ 模板題 poj 3264

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