洛谷P2880

P2880 [USACO07JAN] Balanced Lineup G

牛太多,数组爆了,要么ST表要么树状数组。。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N = 50005;
int n, q;
int h[N];
int st_max[N][20], st_min[N][20];
int log2n[N];

void build() {
    for(int i = 1; i <= n; i++) {
        st_max[i][0] = st_min[i][0] = h[i];
    }

    for(int j = 1; (1 << j) <= n; j++) {
        for(int i = 1; i + (1 << j) - 1 <= n; i++) {
            st_max[i][j] = max(st_max[i][j - 1], st_max[i + (1 << (j - 1))][j - 1]);
            st_min[i][j] = min(st_min[i][j - 1], st_min[i + (1 << (j - 1))][j - 1]);
        }
    }
    log2n[1] = 0;
    for(int i = 2; i <= n; i++) {
        log2n[i] = log2n[i / 2] + 1;
    }
}

int query_max(int l, int r) {
    int k = log2n[r - l + 1];
    return max(st_max[l][k], st_max[r - (1 << k) + 1][k]);
}

int query_min(int l, int r) {
    int k = log2n[r - l + 1];
    return min(st_min[l][k], st_min[r - (1 << k) + 1][k]);
}

int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    cin >> n >> q;
    for(int i = 1; i <= n; i++) cin >> h[i];

    build();

    while(q--) {
        int a, b; cin >> a >> b;
        cout << query_max(a, b) - query_min(a, b) << '\n';
    }
    
    return 0;
}

//27分
// int main() {
//     int n, q; cin >> n >> q;
//     vector<int>h(n + 1);
//     vector<vector<int>> arr1(n + 1, vector<int>(n + 1, 0));
//     vector<vector<int>> arr2(n + 1, vector<int>(n + 1, 0));
//     for(int i = 1; i <= n; i++) {
//         cin >> h[i];
//     }
//     for(int i = 1; i <= n; i++) {
//         arr1[i][i] = arr2[i][i] = h[i];
//         for(int j = i + 1; j <= n; j++) {
//             arr1[j][i] = arr1[i][j] = max(arr1[i][j - 1], h[j]);
//             arr2[j][i] = arr2[i][j] = min(arr2[i][j - 1], h[j]);
//         }
//     }
//     for(int i = 1; i <= q; i++) {
//         int a, b;
//         cin >> a >> b;
//         cout << arr1[a][b] - arr2[a][b] << '\n';
//     }
//     return 0;
// }
posted @ 2025-05-14 14:47  Chuan81  阅读(10)  评论(0)    收藏  举报