51nod1174(RMQ)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174

题意:中文题诶~

思路:RMQ模板题

 关于RMQ: http://blog.csdn.net/liang5630/article/details/7917702

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 10010
 3 using namespace std;
 4 
 5 int dp[MAXN][30], a[MAXN]; //dp[i][j]存储从下标i开始,长度为2^j区间的最大值
 6 
 7 int main(void){
 8     int n;
 9     scanf("%d", &n);
10     for(int i=0; i<n; i++){
11         scanf("%d", &a[i]);
12         dp[i][0]=a[i];    //dp初始化
13     }
14     int len=log2(n);
15     for(int j=1; j<=len; j++){ //长度为2^j的区间最大值可以由相邻的两个长度为2^(j-1)的区间合成
16         for(int i=0; i<n; i++){
17             if(i+(1<<j)<=n){
18                 dp[i][j]=max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]); //从相邻两个区间中选取最大值
19             }
20         }
21     }
22     int m;
23     scanf("%d", &m);
24     while(m--){
25         int s, e;
26         scanf("%d%d", &s, &e);
27         int cnt=log2(e-s+1);
28         cout << max(dp[s][cnt], dp[e-(1<<cnt)+1][cnt]) << endl;
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/geloutingyu/p/6230784.html