http://blog.csdn.net/niushuai666/article/details/7400587
看过神牛的RMQ算法之后自己算是默写了遍.....
交上去的时候,华丽丽的超时了。因为我用的是 cin cout
才想到当输入和输出的次数多时,那么这两个是很耗时间的。
View Code
1 2 #include <iostream> 3 #include <stdio.h> 4 #include <cmath> 5 using namespace std; 6 const int maxn= 100010; 7 int maxsum[maxn][20], minsum[maxn][20]; 8 int max(int a, int b) 9 { 10 return a > b ? a : b; 11 } 12 int min(int a, int b) 13 { 14 return a > b ? b : a; 15 } 16 void RMQ(int num) 17 { 18 int i, j; 19 for(j = 1; j < 20; ++j) 20 for(i = 1; i <= num; ++i) 21 if(i + (1 << j) - 1 <= num) 22 { 23 maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]); 24 minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]); 25 } 26 } 27 28 int main() 29 { 30 int n, q, i, j, a, b, ma, mi; 31 scanf("%d%d",&n,&q); 32 for(i = 1; i <= n; i++) 33 { 34 scanf("%d",&maxsum[i][0]); 35 minsum[i][0] = maxsum[i][0]; 36 } 37 RMQ(n); 38 while(q--) 39 { 40 scanf("%d%d",&a,&b); 41 int k = ( int )(log(b - a + 1)/log(2.0)); 42 ma = max(maxsum[a][k], maxsum[b - (1 << k) + 1][k]); 43 mi = min(minsum[a][k], minsum[b - (1 << k) + 1][k]); 44 printf("%d\n",ma-mi); 45 } 46 return 0; 47 } 48