POJ3264 Balanced Lineup (RMQST)

题意分析

给出一个序列,询问区间[L,R]中最大值减最小值的差。
ST表

代码总览

#include <cstdio>
#include <algorithm>
#define rep(i,a,b) for (int i = a; i<=b; ++i)
using namespace std;
const int nmax = 5e4 + 100;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef double db;
int dp[nmax][20][2];
int a[nmax];
int n, m;
void getRMQ() {
    rep(i, 1, n) dp[i][0][0] = dp[i][0][1] = a[i];
    for (int j = 1; (1 << j) <= n ; ++j) {
        for (int i = 1; i + ( 1 << j ) - 1 <= n; ++i) {
            dp[i][j][0] = max(dp[i][j - 1][0], dp[i + (1 << (j - 1 ))][j - 1][0]);
            dp[i][j][1] = min(dp[i][j - 1][1], dp[i + (1 << (j - 1 ))][j - 1][1]);
        }
    }
}
int RMQmax(int l, int r) {
    int k = 0;
    while ( (1 << (k + 1)) <= r - l + 1) ++k;
    return max(dp[l][k][0], dp[r - (1 << k) + 1][k][0]);
}
int RMQmin(int l, int r) {
    int k  = 0;
    while ( (1 << (k + 1)) <= r - l + 1) ++k;
    return min(dp[l][k][1], dp[r - (1 << k) + 1][k][1]);
}

int main() {
    scanf("%d %d", &n, &m);
    rep(i, 1, n) scanf("%d", &a[i]);
    getRMQ();
    int l, r;
    rep(i, 1,  m) {
        scanf("%d%d", &l, &r);
        printf("%d\n", RMQmax(l, r) - RMQmin(l, r));
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/pengwill97/article/details/80423951