首页 > 其他 > 详细

Sparse Table

时间:2021-04-27 20:26:06      阅读:42      评论:0      收藏:0      [点我收藏+]

Sparse Table

Sparse Table是一种简单的离线数据结构,主要用于解决RMQ(Range Maximum/Minimum Query, 区间最值查询)问题。它主要应用倍增的思想,可以实现 \(O(nlogn)\) 预处理、 \(O(1)\) 查询。

ST使用一个二维数组 \(f\) ,先预处理范围内所有的 \(f[a][b] = \max ({A_{i}})_{i\in[a, a+2^b-1]}\)。查询时再利用这些子区间算出待求区间的最大值。

具体的查询方法:对于区间 $[l, r] $,我们取其两个等长的连续子区间将其覆盖。注意,这两个子区间不一定交集为空。由于区间的长度为 \(r-l+1\) ,而我们预处理的\(f\)数组将区间划分为 \(2\) 的整数倍,因此可以将区间 \([l,r]\) 拆分为两个长度为 \(2^{\lfloor{log_2{(r-l+1)}\rfloor}}\)的子区间 ,分别为

\([l, l+2^s-1]\)\([r-2^s+1,r]\)

技术分享图片

代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;

int n, m, l, r;
int f[N][21]; // 第二维根据数据范围决定, 不小于log(N)
int Log2[N];

int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i){
        scanf("%d", &f[i][0]);
    }
    for(int i = 1; i <= n; ++i){ // dim 2
        for(int j = 1; j + (1 << i)-1 <= n; ++j){ // dim 1
            f[j][i] = max(f[j][i-1], f[j+(1<<(i-1))][i-1]);
        }
    }
    for(int i = 2; i <= n; ++i){
        Log2[i] = Log2[i/2] + 1;
    }
    
    while(m--){
        scanf("%d%d", &l, &r);
        int s = Log2[r-l+1];
        printf("%d\n", max(f[l][s], f[r-(1<<s)+1][s]));
    }
    
    system("pause");
    return 0;
}

Sparse Table

原文:https://www.cnblogs.com/popodynasty/p/14709311.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!