【51Nod】1174 区间中最大的数

来源:互联网 发布:淘宝开店交多少保证金 编辑:程序博客网 时间:2024/05/10 07:59

题意

给出一个有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;}