洛谷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;
// }

浙公网安备 33010602011771号