二维st求调
查看原帖
二维st求调
1100967
ssbcf楼主2023/12/27 12:28
#include <bits/stdc++.h>
using namespace std;
const int INF = 0;
const int maxn=1005 ;
const int logn=10;
int a,b,n;
int mmax[maxn][maxn][logn];//mmax[i][j][k]表示第ij点为起点,向右下2的k次的方形矩阵中最大的数
int mmin[maxn][maxn][logn];
int ans=INF;
int len;
int maa(int x,int y,int z,int t){
    int e=max(x,y);
    int g=max(z,t);
    return max(e,g);
}
int mii(int x,int y,int z,int t){
    int e=min(x,y);
    int g=min(z,t);
    return min(e,g);

}
void rmq(){
    for(int k=1;k<=7;++k){
        for(int i=1;i+(1<<k)-1<=a;++i){
            for(int j=1;j+(1<<k)-1<=b;++j){
                mmax[i][j][k]=maa(mmax[i][j][k-1],mmax[i+(1<<(k-1))][j][k-1],mmax[i][j+(1<<(k-1))][k-1],mmax[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
                mmin[i][j][k]=mii(mmin[i][j][k-1],mmin[i+(1<<(k-1))][j][k-1],mmin[i][j+(1<<(k-1))][k-1],mmin[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);                
                
            }
        }
    }
}

int query(int i, int j) {
    int ma, mi;
    ma = maa(mmax[i][j][len], mmax[i + n - (1 << len)][j][len - 1], mmax[i][j + n - (1 << len)][len - 1], mmax[i + n - (1 << len)][j + n - (1 << len)][len - 1]);
    mi = mii(mmin[i][j][len], mmin[i + n - (1 << len)][j][len - 1], mmin[i][j + n - (1 << len)][len - 1], mmin[i + n - (1 << len)][j + n - (1 << len)][len - 1]);
    return ma - mi;
}
int main()
{
    scanf("%d%d%d",&a,&b,&n);
    len=log2(n);
    for(int i=1;i<=a;++i){
        for(int j=1;j<=b;++j){
            scanf("%d",&mmax[i][j][0]);
            mmin[i][j][0]=mmax[i][j][0];
        }
    }
    rmq();
    for(int i=1;i<=a-n+1;++i){
        for(int j=1;j<=b-n+1;++j){
            ans=min(ans,query(i,j));
        }
    }
    printf("%d\n",ans);
    return 0;
}

只有10pts,评论区有佬发了一组数据

8 7 4
61 52 58 52 10 92 47 
64 73 7 12 60 62 25 
73 37 37 37 26 56 83 
4 43 48 90 15 3 98 
6 99 37 6 85 8 70 
81 40 96 47 1 94 18 
51 1 41 47 68 58 50 
55 67 37 90 83 40 9

答案83 也跑出来了,实在没找到哪有问题,求调

2023/12/27 12:28
加载中...