码迷,mamicode.com
首页 > 编程语言 > 详细

ST表算法详解

时间:2018-06-17 11:01:45      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:st表   规则   style   for   算法   相同   倍增   write   IV   

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表   规则   style   for   算法   相同   倍增   write   IV   

原文地址:https://www.cnblogs.com/kousak/p/9191453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!