文章目录

ST算法
RMQ【区间最值】的ST算法是倍增思想的产物
ll a[N], f[N][20];//f表示从i起的2^j个数中的最大值
void ST_prework()//ST算法,处理RMQ【区间最值】问题【倍增算法】
{
for (ll i = 1; i <= n; i++)
f[i][0] = a[i];//先进行预处理[Ai~Ai]最大值为a[i]
ll t = log2(n);//或者写成t=log(n)/log(m)【m=2】
for (ll j = 1; j <= t; j++)
{
for (ll i = 1; i + (1 << j) - 1 <= n; i++)//注意减1是因为个数中包含了i
{//把[i~i+2^j]分成[i~2^(j-1)-1]和[i+2^(j-1)~i+2^j]两段
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]); //+-比移位优先,所以注意()
}
}
}
****************************************************************************************
ll ST_query(ll l, ll r)
{
ll k = log2(r - l + 1);//注意区间长度是[r-l+1]
return max(f[l][k], f[r - (1 << k) + 1][k]);//将[l~r]分成[l~l+2^k-1]和[r-2^k+1~r]两段,即l的后2^k个数和r的前2^k个数;重合不要紧,不漏就行
}