ST.java 2.5 KB
Newer Older
qq_36480062's avatar
commit  
qq_36480062 已提交
1 2
package RMQ;

qq_36480062's avatar
commit  
qq_36480062 已提交
3 4
import java.util.Random;

qq_36480062's avatar
commit  
qq_36480062 已提交
5
/**
qq_36480062's avatar
c  
qq_36480062 已提交
6
 * https://blog.csdn.net/qq_41311604/article/details/79900893
qq_36480062's avatar
commit  
qq_36480062 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 * 只给出模板
 * dp[i][j] = min(dp [i][j - 1], dp [i + (1 << j - 1)][j - 1])
 * 由此给出下列代码:
 * void rmq_init()
 * {
 * for(int i=1;i<=N;i++)
 * dp[i][0]=arr[i];//初始化
 * for(int j=1;(1<<j)<=N;j++)
 * for(int i=1;i+(1<<j)-1<=N;i++)
 * dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
 * }
 * 查询
 * int rmq(int l,int r)
 * {
 * int k=log2(r-l+1);
 * return min(dp[l][k],dp[r-(1<<k)+1][k]);
 * }
 */
public class ST {
    public static void main(String[] args) {
qq_36480062's avatar
c  
qq_36480062 已提交
27 28 29 30 31 32 33 34 35 36 37
        for (int z = 20; z < 20000; z++) {
            N = z;
            arr = ran(N);
            init();
            for (int i = 1; i <= N; i++) {
                for (int j = i + 1; j <= N; j++) {
                    if (rmq(i, j) != rmqq(i, j))
                        System.out.println("No");
                }
            }
        }
qq_36480062's avatar
commit  
qq_36480062 已提交
38 39


qq_36480062's avatar
commit  
qq_36480062 已提交
40
    }
qq_36480062's avatar
commit  
qq_36480062 已提交
41

qq_36480062's avatar
commit  
qq_36480062 已提交
42 43 44 45 46 47 48 49
    static int[] ran(int a) {
        Random r = new Random();
        int[] arr = new int[a];
        for (int i = 0; i < a; i++) {
            arr[i] = r.nextInt(500);
        }
        return arr;
    }
qq_36480062's avatar
commit  
qq_36480062 已提交
50

qq_36480062's avatar
commit  
qq_36480062 已提交
51 52 53 54
    static int N = 7;
    static int[][] st;
    static int[] log;
    static int[] arr = {22, 23, 8, 67, 7, 7, 2};
qq_36480062's avatar
commit  
qq_36480062 已提交
55 56

    static void init() {
qq_36480062's avatar
c  
qq_36480062 已提交
57
        log = new int[N + 1];
qq_36480062's avatar
commit  
qq_36480062 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
        log[1] = 0;
        for (int i = 2; i <= N; i++) {
            log[i] = log[i / 2] + 1;
        }
        st = new int[N + 2][log[N] + 2];
        for (int i = 1; i <= N; i++) {
            st[i][0] = arr[i - 1];
        }
        for (int j = 1; 1 << j <= N; j++) {
            for (int i = 1; i + (1 << j) - 1 <= N; i++) {
                st[i][j] = Math.min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
            }
        }
    }

    static void init2() {
        log = new int[N + 2];
        log[1] = 0;
        for (int i = 2; i <= N; i++) {
            log[i] = log[i / 2] + 1;
        }
        st = new int[N + 2][log[N] + 2];
qq_36480062's avatar
commit  
qq_36480062 已提交
80
        for (int i = 1; i <= N; i++) {
qq_36480062's avatar
commit  
qq_36480062 已提交
81
            st[i][0] = arr[i - 1];
qq_36480062's avatar
commit  
qq_36480062 已提交
82 83 84
        }
        for (int j = 1; 1 << j <= N; j++) {
            for (int i = 1; i + (1 << j) - 1 <= N; i++) {
qq_36480062's avatar
commit  
qq_36480062 已提交
85
                st[i][j] = Math.min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
qq_36480062's avatar
commit  
qq_36480062 已提交
86 87 88 89 90 91
            }
        }
    }

    static int rmq(int l, int r) {
        int k = (int) (Math.log(r - l + 1) / Math.log(2));
qq_36480062's avatar
commit  
qq_36480062 已提交
92 93 94 95 96 97
        return Math.min(st[l][k], st[r - (1 << k) + 1][k]);
    }

    static int rmqq(int l, int r) {
        int k = log[r - l + 1];
        return Math.min(st[l][k], st[r - (1 << k) + 1][k]);
qq_36480062's avatar
commit  
qq_36480062 已提交
98
    }
qq_36480062's avatar
commit  
qq_36480062 已提交
99
}