POJ 3264 Balanced Lineup (RMQ)

来源:互联网 发布:什么是京东数据 编辑:程序博客网 时间:2024/06/05 04:11

检验模板

代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;const int N = 200005;int n, m;int rmax[N][20], rmin[N][20], rmi[N], dp[N];void rmqinit(int *A, int n) {    rmi[0] = -1;    for (int i = 1; i <= n; i++) {        rmi[i] = ((i&(i - 1)) == 0) ? rmi[i - 1] + 1 : rmi[i - 1];        rmax[i][0] = A[i];        rmin[i][0] = A[i];    }    for (int j = 1; j <= rmi[n]; j++) {        for (int i = 1; i + (1<<j) - 1 <= n; i++) {            rmax[i][j] = max(rmax[i][j - 1], rmax[i + (1<<(j - 1))][j - 1]);            rmin[i][j] = min(rmin[i][j - 1], rmin[i + (1<<(j - 1))][j - 1]);        }    }}int rmqmax(int l, int r) {    int k = rmi[r - l + 1];    return max(rmax[l][k], rmax[r - (1<<k) + 1][k]);}int rmqmin(int l, int r) {    int k = rmi[r - l + 1];    return min(rmin[l][k], rmin[r - (1<<k) + 1][k]);}int main() {    while (~scanf("%d%d", &n, &m)) {        for (int i = 1; i <= n; i++) scanf("%d", &dp[i]);        rmqinit(dp, n);        int l, r;        while (m--) {            scanf("%d%d", &l, &r);            printf("%d\n", rmqmax(l, r) - rmqmin(l, r));        }    }    return 0;}



0 0
原创粉丝点击