ST表算法详解

Posted kousak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ST表算法详解相关的知识,希望对你有一定的参考价值。

ST表是用来解决RMQ(区间最值)问题的算法

预处理O(nlgn) 查询O(1) 不支持在线查询

最小值可以合并但不支持分割

比如说我们知道[1,9]和[6,10]的最小值,我们可以知道[1,10]的最小值,但不能知道[6,9]的最小值

我们可以枚举以每个节点为起点经过k个节点的最值

但是预处理是O(n2),这时候我们想到了倍增,一种十分巧妙的思想

它可以在变化规则相同的情况下加速状态转移,我们每次把k扩大一倍

f[i,j]表示[i,i+2j-1]区间内的信息

f[i,j]:=f[i,j-1]∪f[i+2j-1]


代码实现

var m,n,i,j,x,y,t:longint;
    bin,log,a:array[1..200000]of longint;
    f:array[1..20,1..200000]of longint;
function min(x,y:longint):longint;
begin
  if x<y then exit(x)
    else exit(y);
end;
begin
  bin[0]:=1;
  for i:=1 to 20 do bin[i]:=bin[i-1]*2;
  log[0]:=-1;
  for i:=1 to 200000 do
    log[i]:=log[i div 2]+1;
  readln(m,n);
  for i:=1 to m do read(a[i]);
  for i:=1 to m do f[0,i]:=a[i];
  for i:=1 to log[m] do
    for j:=1 to m do
    f[i,j]:=min(f[i-1,j],f[i-1,j+bin[i-1]]);
  for i:=1 to n do
  begin
    readln(x,y);
    t:=log[y-x+1];
    write(min(f[t,x],f[t,y-bin[t]+1]), );
  end;
end.

 

以上是关于ST表算法详解的主要内容,如果未能解决你的问题,请参考以下文章

ST表超级详解

算法小讲堂之ST表算法详解

ST表算法详解

ST算法详解

LCA 算法ST表

ST表详解(稀疏表)