ST表学习笔记

\(nlog(n)\)初始化,\(O(1)\)在线查询,简短高效的RMQ,虽然简单但用得少Seg_Tree赛高!,所以要写一下。

以后要多用用,又短又快,还可以学四毛子。

for(int i=1,res=0; i<=N; i++)
	log[i]=(res+=(1<<res+1<=i));

初始化,这样就能\(O(1)\)\(log(x)\)了。

for(int i=1; i<=n; i++)
	ST[0][i]=read();
for(int i=1; i<=log[n]; i++)
	for(int j=1; j<n; j++)
		ST[i][j]=max(ST[i-1][j],ST[i-1][j+(1<<i-1)]);

初始化ST表。\(ST_{i,j}\)表示该序列在\([j,j+2^i]\)上的最值。显然\(ST_{0,j}=a_j\)

又显然\([j,j+2^{(i-1)}]\bigcup[j+2^{(i-1)},j+2^{(i-1)}+2^{(i-1)}]=[j,j+2^i]\),故\(ST_{i,j}\)可以这样更新。

max(ST[log[r-l]][l],ST[log[r-l]][r-(1<<log[r-l])+1]))

数学方法易证,\(l+2^{\lfloor log_2(r-l+1)\rfloor}>=r-2^{\lfloor log_2(r-l+1)\rfloor}+1\)

因此\([l,l+2^{\lfloor log_2(r-l+1)\rfloor}]\bigcup [r-2^{\lfloor log_2(r-l+1)\rfloor}+1,r]=[l,r]\),故该序列在\([l,r]\)上的最值可以这样求。

posted @ 2021-09-30 09:10  Seg_Tree  阅读(10)  评论(0)    收藏  举报
https://pic.cnblogs.com/face/