本来这题我是从最短路标签里进去的,但我实在想不出最短路该怎么做,所以就用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; }
解题报告 『 [USACO07JAN]Balanced Lineup』
原文:https://www.cnblogs.com/Kirisame-Marisa/p/11166303.html