ST表

ST 表基于 倍增 思想,,O(1)回答每个询问。但是不支持修改操作。 用于求区间最值。

建树

for (int j = 1; (1 << j) <= n; j++)
{
	for (int i = 1; i + (1 << j) - 1 <= n; i++)
	{
		stmin[i][j] = min(stmin[i][j - 1], stmin[i + (1 << j - 1)][j - 1]);
		stmax[i][j] = max(stmax[i][j - 1], stmax[i + (1 << j - 1)][j - 1]);
	}
}

查询

while(q--)
{
	int l, r;
	cin >> l >> r;
	int x = log2(r - l + 1);
	cout << max(stmax[l][x], stmax[r - (1 << x) + 1][x]) - min(stmin[l][x], stmin[r - (1 << x) + 1][x]) << endl;
}

posted @ 2025-01-21 17:08  流氓兔LMT  阅读(8)  评论(0)    收藏  举报