USACO_2007_Jan_S_Balanced_Lineup
USACO_2007_Jan_S_Balanced_Lineup
思路
区间最大最小值
\(st\)表板子题
代码
神奇的代码
int n = 0;
int mx[maxn][32];
int mn[maxn][32];
int nums[maxn];
// ans[i][j] [i, i + 2 ^ j - 1]的最值
void st_mx()
{
for (int i = 1; i <= n; i++)
{
mx[i][0] = nums[i];
}
int t = log2(n);
for (int j = 1; j <= t; j++)
{
int m = n + 1 - (1 << j);
for (int i = 1; i <= m; i++)
{
mx[i][j] = std::max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
}
}
}
void st_mn()
{
for (int i = 1; i <= n; i++)
{
mn[i][0] = nums[i];
}
int t = log2(n);
for (int j = 1; j <= t; j++)
{
int m = n + 1 - (1 << j);
for (int i = 1; i <= m; i++)
{
mn[i][j] = std::min(mn[i][j - 1], mn[i + (1 << (j - 1))][j - 1]);
}
}
}
int query_mx(int l, int r)
{
int t = log2(r - l + 1);
return std::max(mx[l][t], mx[r + 1 - (1 << t)][t]);
}
int query_mn(int l, int r)
{
int t = log2(r - l + 1);
return std::min(mn[l][t], mn[r + 1 - (1 << t)][t]);
}
void solve()
{
int q = 0;
std::cin >> n >> q;
for (int i = 1; i <= n; i++)
{
std::cin >> nums[i];
}
st_mn();
st_mx();
int l = 0, r = 0;
for (int i = 1; i <= q; i++)
{
std::cin >> l >> r;
std::cout << query_mx(l, r) - query_mn(l, r) << endl;
}
}

浙公网安备 33010602011771号