st表其实就是运用dp思想解决RMQ问题
你想解决这个区间长度 那我开一个二维数组dp[i][j] 长度为2^j 代表区间[i,i+2^j-1]
那么显而易见 我们可以继续再分 分的基础是什么呢 就是[i,2^(j-1)-1],[2^(j-1)-1,,i+2^j-1]
同理是不是最后得到什么?没错 就是j=0时候 那么长度为1 就是原数组 我再回来不就得到min了吗?
在线查询怎么做?
那么我既然是等分的 所以对我查询的空间我一定要凑等分
显然可以 (int)(log(i+2^j-1-i+1)) 就是这个倍数j
但是我的板子不这样做 ps卿学姐的板子
于是就解决了
树状数组也能求RMQ 但是其实还好 只不过不能单点更新 只能后插入
ST表板子
int d[1000006][25];//左端点为i(长度),长度为2^j,管辖了[i,i+2^j-1]
int mn[1000006];
void rmq_init()
{
for(int i=1;i<=n;i++)
d[i][0]=a[i];//原数组长度
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)//-1防止越界
d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);//d[5,3]=min(d[5,2),d[9,2]) =min(min(5...8),min(9...12))
for(int len=1;len<=n