RMQ(区间最值问题)
题意:先给出一组数,然后给出区间,求区间内最大值与最小值的差
思路:RMQ的ST
#include<iostream> #include<cmath> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define N 50010 int height[N]; int fmax[N][16],fmin[N][16],n; //二维数组的纵坐标是 1<<j 是指数的幂 不用N那么大 void rmqInit() { int k = (int)(log((double)n)/log(2.0)); int i,j; for(i = 0;i < n;i++) { fmax[i][0] = height[i]; fmin[i][0] = height[i]; } for(j = 1;j <= k;j++) //先遍历j 再遍历i for(i = 0;i+(1<<j)-1 < n;i++) { int m = i + (1<<(j-1)); fmax[i][j] = max(fmax[i][j-1],fmax[m][j-1]); fmin[i][j] = min(fmin[i][j-1],fmin[m][j-1]); } } int rmq(int a,int b) { int k = (int)(log(double(b-a+1))/log(2.0)); int ta = max(fmax[a][k],fmax[b-(1<<k)+1][k]); int tb = min(fmin[a][k],fmin[b-(1<<k)+1][k]); return ta - tb; } int main() { int q; scanf("%d%d",&n,&q); int i; for(i = 0;i < n;i++) scanf("%d",height+i); rmqInit(); int a,b; while(q--) { scanf("%d%d",&a,&b); printf("%d\n",rmq(a-1,b-1)); } return 0; }