ST表 (求区间最大/最小值)

ST表

ST表的功能很简单

它是解决RMQ问题(区间最值问题)的一种强有力的工具

它可以做到O(nlogn)预处理,O(1)是查询最值

像线段树是O(logn)的查询

 

算法

ST表是利用的是倍增的思想

拿最大值来说

我们用st[i][j]表示,从i位置开始的2^j个数中的最大值,例如st[i][1]表示的是i位置和i+1位置中两个数的最大值

那么转移的时候我们可以把当前区间拆成两个区间并分别取最大值(注意这里的编号是从1开始的)

查询的时候也比较简单

我们计算出log2(​区间长度)

然后对于左端点和右端点分别进行查询,这样可以保证一定可以覆盖查询的区间

刚开始学的时候我不太理解为什么从右端点开始查的时候左端点是r-2^k+1r−2k+1

实际很简单,因为我们需要找到一个点x,使得x+2^k-1=r

这样的话就可以得到x=r−2^k+1

#include
using namespace std;
const int N=1e6+10;
int st[N][21]; 
int query(int l,int r)
{
	int k=log

你可能感兴趣的:(Daily,algorithm,st)