标签: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表 规则 style for 算法 相同 倍增 write IV
原文地址:https://www.cnblogs.com/kousak/p/9191453.html