【51Nod】1174 區間中最大的數
阿新 • • 發佈:2019-02-14
題意
給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。
例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7。(該問題也被稱為RMQ問題)
解題思路
RMQ經典問題
參考程式碼
#include <iostream>
using namespace std;
const int MAXN = 10010;
int dp[MAXN][20];
int mm[MAXN];
void initRMQ(int n, int b[])
{
mm[0] = -1;
for (int i = 1 ; i <= n; i++)
{
mm[i] = ((i & (i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];
dp[i][0] = b[i];
}
for (int j = 1; j <= mm[n]; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1 ))][j - 1]);
}
}
}
int rmq(int x, int y)
{
int k = mm[y - x + 1];
return max(dp[x][k], dp[y - (1 << k) + 1][k]);
}
int main(int argc, const char * argv[])
{
int N;
cin >> N;
int b[MAXN];
for (int i = 1; i <= N; i++)
{
cin >> b[i];
}
initRMQ(N, b);
int Q;
cin >> Q;
int left, right;
for (int i = 0; i < Q; i++)
{
cin >> left >> right;
cout << rmq(left + 1, right + 1) << '\n';
}
return 0;
}