P2880 [USACO07JAN] Balanced Lineup G - 洛谷
分析
-
f[i][j]记录以i开头,长度为2^i的子段的最值
-
f[i][j+1]=max( f[i][j] , f[i+2^(j-1)][j-1] )
代码实现
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e6+10;
int f[N][30], h[N], g[N][30];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n, q;cin >> n >> q;for (int i = 1; i <= n; i++){cin >> h[i];f[i][0] = h[i];g[i][0] = h[i];}int len = log2(n + 1);for (int j = 1; j <= len; j++)for (int i = 1; i <= n; i++){f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);g[i][j] = min(g[i][j - 1], g[i + (1 << (j - 1))][j - 1]);}while (q--){int a, b;cin >> a >> b;int k = log2(b - a + 1);cout << max(f[a][k], f[b - (1 << k) +1][k]) - min(g[a][k], g[b - (1 << k) +1][k]) << endl;}return 0;
}