POJ 3264 Balanced Lineup(RMQ模版)
RMQ就是利用DP的思想,主要是解决求快速求区间最值的问题的。网上很多资料。
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdio> 5 using namespace std; 6 #define N 500000 7 int p[N]; 8 int dpmin[22][N]; 9 int dpmax[22][N]; 10 int bin[21]; 11 void CL(int n) 12 { 13 int i,j; 14 for(i = 1;i <= n;i ++) 15 { 16 dpmin[0][i] = p[i]; 17 dpmax[0][i] = p[i]; 18 } 19 for(i = 1;bin[i] <= n;i ++) 20 { 21 for(j = 1;j + bin[i-1] <= n;j ++) 22 { 23 dpmin[i][j] = min(dpmin[i-1][j],dpmin[i-1][j+bin[i-1]]); 24 dpmax[i][j] = max(dpmax[i-1][j],dpmax[i-1][j+bin[i-1]]); 25 } 26 } 27 } 28 int rmqmax(int s,int t) 29 { 30 int k = log((t-s+1)*1.0)/log(2.0);//默认保留整数 31 return max(dpmax[k][s],dpmax[k][t - bin[k] + 1]); 32 } 33 int rmqmin(int s,int t) 34 { 35 int k = log((t-s+1)*1.0)/log(2.0); 36 return min(dpmin[k][s],dpmin[k][t - bin[k] + 1]); 37 } 38 int query(int s,int t) 39 { 40 return rmqmax(s,t) - rmqmin(s,t); 41 } 42 int main() 43 { 44 int n,m,i,x,y; 45 for (i = 0; i <= 21; ++i) 46 bin[i] = 1<<i; 47 while(scanf("%d%d",&n,&m)!=EOF) 48 { 49 for(i = 1;i <= n;i ++) 50 scanf("%d",&p[i]); 51 CL(n); 52 for(i = 1;i <= m;i ++) 53 { 54 scanf("%d%d",&x,&y); 55 printf("%d\n",query(x,y)); 56 } 57 } 58 return 0; 59 }