【总结】 ST表

\(ST\)

\(ST\) 表这个东西也是十分的 \(easy\) 了。

这里给道板子。

\(link\)

怎末说 \(ST\) 表这个东西呢,其实就是一个简单 \(dp\)

就是一个 \(f_{i,j}\) 表示从 \(i\) 开始往后 \(2^j\) 个数字中的最大或最小值。

转移也很好转:\(f_{i,j}=max/min(f_{i,j-1},f_{i+2^{j-1}-1,j-1})\)

很明了吧。

最后的查询呢?

更简单,查询 \([l,r]\) 中的最大值为例吧。

现设 $x=\left \lfloor log_{r-l+1} \right \rfloor $。

\(Max_{l,r}=max{f_{l,x},f_{r-2^x,r}}\)

可见这两个区间有可能有交集,不过这又怎样呢,只要求出最大值即可。

void st(){
	for(ll i=1;i<=n;i++)f[i][0]=a[i];
	for(ll j=1;j<=18;j++){
		for(ll i=1;i<=n-(1<<j)+1;i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}
ll query(ll l,ll r){
	ll g=lg[r-l+1];
	return max(f[l][g],f[r-   t[g] +1  ][g]);
}
posted @ 2025-08-07 14:32  Kcjhfqr  阅读(9)  评论(0)    收藏  举报
.poem-wrap { position: relative; width: 1000px; max-width: 80%; border: 2px solid #797979; border-top: none; text-align: center; margin: 40px auto; } .poem-left { left: 0; } .poem-right { right: 0; } .poem-border { position: absolute; height: 2px; width: 27%; background-color: #797979; } .poem-wrap p { width: 70%; margin: auto; line-height: 30px; color: #797979; } .poem-wrap h1 { position: relative; margin-top: -20px; display: inline-block; letter-spacing: 4px; color: #797979; font-size: 2em; margin-bottom: 20px; } #poem_sentence { font-size: 25px; } #poem_info { font-size: 15px; margin: 15px auto; }