ST表(Sparse Table, 稀疏表)模板题及其解法

题目

ST表(Sparse Table, 稀疏表)模板题及其解法_第1张图片
关键在于如何在O(1)时间内回返回查询结果。我们使用ST表实现。
源题链接: https://www.luogu.com.cn/problem/P3865

题解

//package org.example;

import java.util.Scanner;


public class Main {
    static int n;
    static int m;
    static int[][] st;

    public static void prepare(){
        // 初始化ST表
        // 应该选循环j,再循环i
        for(int j = 1; j < m; j++){
            for(int i = 0; i < n; i++){
                if((i + (1 << (j - 1))) < n){
                    st[i][j] = Math.max(st[i][j-1], st[i + (1 << (j - 1))][j-1]);
                }else{
                    st[i][j] = st[i][j-1];
                }
            }
        }
    }

    public static int solve(int l, int r){
        int j = (int)(Math.log(r - l + 1) / Math.log(2));
        return Math.max(st[l][j], st[r + 1 - (1 << (j))][j]);
    }


    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            n = scanner.nextInt();
            int M = scanner.nextInt();
            m = (int) Math.ceil(Math.log(n) / Math.log(2)) + 1;
            st = new int[n][m];
            for(int i = 0; i < n; i++){
                st[i][0] = scanner.nextInt();
            }
            // 获花O(nlogn)时间预处理
            prepare();
            for(int i = 0; i < M; i++){
                int l = scanner.nextInt();
                int r = scanner.nextInt();
                // O(1)时间回答果询
                System.out.println(solve(l-1, r-1));
            }
        }
    }
}

你可能感兴趣的:(java,算法,开发语言)