解题报告 『 [USACO07JAN]Balanced Lineup(ST表)』

原题地址

本来这题我是从最短路标签进去的,但实在想不出最短路该怎么做,所以就用ST表水过去了。

 

代码实现如下:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)

const int maxn = 5e4 + 5;

int n, m;
int low[maxn][20], high[maxn][20];

int MIN(int a, int b) {return a < b ? a : b;}

int MAX(int a, int b) {return a > b ? a : b;}

int read() {
    int x = 0, flag = 0;
    char ch = ' ';
    while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
    if (ch == '-') {
        flag = 1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return flag ? -x : x;
}

int ST(int l, int r) {
    int k, a, b;
    k = log(r - l + 1) / log(2);
    a = MIN(low[l][k], low[r - (1 << k) + 1][k]);
    b = MAX(high[l][k], high[r - (1 << k) + 1][k]);
    return b - a;
}

void write(int x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    if (x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

int main() {
    n = read(), m = read();
    rep(i, 1, n) low[i][0] = high[i][0] = read();
    int t = log(n) / log(2) + 1;
    rep(j, 1, t - 1)
        rep(i, 1, n - (1 << j) + 1) {
            low[i][j] = MIN(low[i][j - 1], low[i + (1 << (j - 1))][j - 1]);
            high[i][j] = MAX(high[i][j - 1], high[i + (1 << (j - 1))][j - 1]);
        }
    rep(i, 1, m) {
        int l, r;
        l = read(), r = read();
        if (l == r) printf("0\n");
        else {
            write(ST(l, r));
            printf("\n");
        }
    }
    return 0;
}
View Code
posted @ 2019-07-10 20:32  雲裏霧裏沙  阅读(187)  评论(0编辑  收藏  举报