# 题解#洛谷P2880 Balanced Lineup #ST表#

P2880 [USACO07JAN] Balanced Lineup G - 洛谷

分析

  1. f[i][j]记录以i开头,长度为2^i的子段的最值

  2. 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;
}
posted @ 2025-12-09 20:05  Ahui2667d  阅读(3)  评论(0)    收藏  举报