复制代码
P3865 【模板】ST 表

#include <iostream> #include <cstdio> #include <cmath> using namespace std; const int N = 1e5 + 10; int n, m; int a[N]; int f[N][20]; int mp[N]; void ST_prework() { for(int i = 1; i <= n; i++) f[i][0] = a[i]; int t = log(n) / log(2); for(int j = 1; j <= t; j++) for(int i = 1; i <= n - (1 << j) + 1; i++) f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]); } int ST_query(int l, int r) { int k = mp[r - l + 1]; return max(f[l][k], f[r - (1 << k) + 1][k]); } int main() { cin >> n >> m; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 0; i <= n; i++) mp[i] = log(i) / log(2); ST_prework(); for(int i = 1; i <= m; i++) { int l, r; scanf("%d%d" ,&l, &r); printf("%d\n", ST_query(l, r)); } return 0; }
复制代码

 二维ST表,二维矩阵内最值

Cornfields

复制代码
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

const int N = 300;

int n, b, k;
int h[N][N];
int f[N][N][10], F[N][N][10];
int mp[N];

void ST_prework() {
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            f[i][j][0] = h[i][j], F[i][j][0] = h[i][j];
    int t = log2(n);
    for(int k = 1; k <= t; k++)
        for(int i = 1; i <= n - (1 << k) + 1; i++)
            for(int j = 1; j <= n - (1 << k) + 1; j++) {
                f[i][j][k] = max(max(f[i][j][k - 1], f[i + (1 << k - 1)][j][k - 1]),
                                 max(f[i][j + (1 << k - 1)][k - 1], f[i + (1 << k - 1)][j + (1 << k - 1)][k - 1]));
                F[i][j][k] = min(min(F[i][j][k - 1], F[i + (1 << k - 1)][j][k - 1]),
                                 min(F[i][j + (1 << k - 1)][k - 1], F[i + (1 << k - 1)][j + (1 << k - 1)][k - 1]));
            }

}

int ST_query(int x1, int y1, int x2, int y2) {
    int len = mp[b];
    return max(max(f[x1][y1][len], f[x2 - (1 << len) + 1][y1][len]),
               max(f[x1][y2 - (1 << len) + 1][len], f[x2 - (1 << len) + 1][y2 - (1 << len) + 1][len]))
           - (min(min(F[x1][y1][len], F[x2 - (1 << len) + 1][y1][len]),
                  min(F[x1][y2 - (1 << len) + 1][len], F[x2 - (1 << len) + 1][y2 - (1 << len) + 1][len])));
}

int main() {
    cin >> n >> b >> k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n ; j++)
            scanf("%d", &h[i][j]);
    for(int i = 1; i <= n; i++)
        mp[i] = log2(i);
    ST_prework();
    while(k--) {
        int x, y;
        scanf("%d%d", &x, &y);
        printf("%d\n", ST_query(x, y, x + b - 1, y + b - 1));
    }
    return 0;
}
复制代码

 

posted on   我疯故我在  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】



点击右上角即可分享
微信分享提示