ST表
P2880 [USACO07JAN] Balanced Lineup G
思路
没有操作,只有区间查询,考虑用ST表去维护区间 \(max\) 和 \(min\)。
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 5e4+5;
ll log_2[N], mx[N][18], mn[N][18];
int n, q;
void init(){
for(int j=1; (1<<j) <=n; ++j)
for(int i=1; i + (1<<j) - 1 <=n; ++i){
mx[i][j] = max(mx[i][j-1], mx[i+(1<<j-1)][j-1]);
mn[i][j] = min(mn[i][j-1], mn[i+(1<<j-1)][j-1]);
}
}
int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for(int i=1, a; i<=n; ++i){
cin >> a;
mx[i][0] = mn[i][0] = a;
}
for(int i=2; i<=n; ++i){
log_2[i] = log_2[i>>1] + 1;
}
init();
while(q--){
int l, r;
cin >> l >> r;
ll x = log_2[r-l+1];
ll Max = max(mx[l][x], mx[r - (1<<x) + 1][x]);
ll Min = min(mn[l][x], mn[r - (1<<x) + 1][x]);
cout << Max - Min << '\n';
}
return 0;
}

浙公网安备 33010602011771号