ST表的应用是解决RMQ问题,预处理建ST表的时间复杂度是O(nlog n),一般是解决求区间极值也可维护gcd的问题,高级应用是求区间里一个数字出现最多的次数,求次数。
基本原理可以看这篇文章++++++++++++++++++++++++++++++++++
ST表预处理
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e4+10;
int f[N][20],a[N],lg[N];
int n;
void init ()
{
for (int i=1;i<n;i++)
{
f[i][0] = a[i];
if (i!=1) lg[i] = lg[i>>1]+1;
}
for (int j=1;j<=lg[n];j++)
{
for (int i=1;i<=n-(1<<j)+1;i++)
{
f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
}
查询操作
int query(int x, int y)
{
int t = lg(y-x);
int a = f[x][t];
int b = f[y - (1 << t) + 1][t];
return max(a,b);
}
求区间里一个数字出现最多的次数,求次数。
例题讲解-----------------------------------
后来做cf ,发现了一道st表的题,是Codeforces #736 div2的D题
题目链接在此+++++++++++++
题目叙述
空白
B站有位大三的大佬视频讲解
视频链接+++++++++++++++++++++++++++++++++++++++++++++