题目:点这里
题意:给一个长度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 ",maxm-minm); } }
用 cin 和cout 会超时……