1. 程式人生 > >【51Nod】1174 區間中最大的數

【51Nod】1174 區間中最大的數

題意

給出一個有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; }