首页 > 其他 > 详细

解题报告 『 [USACO07JAN]Balanced Lineup』

时间:2019-07-10 21:01:54      阅读:102      评论:0      收藏:0      [点我收藏+]

原题地址

本来这题我是从最短路标签里进去的,但我实在想不出最短路该怎么做,所以就用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

解题报告 『 [USACO07JAN]Balanced Lineup』

原文:https://www.cnblogs.com/Kirisame-Marisa/p/11166303.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!