30pts求调
查看原帖
30pts求调
1259790
KIDPhantom楼主2024/9/8 17:51
#include <climits>
#include <iostream>

using namespace std;

const int N = 1010;

int a, b, n;
int W[N][N];
int RMX[N][N], RMN[N][N];
int C[N], CMX[N], CMN[N];
int Q[N], hh, tt;

void getMax(int tar[], int sou[], int len)
{
    hh = 0, tt = -1;
    for (int i = 1; i <= len; i++)
    {
        if (hh <= tt && Q[hh] <= i - n) hh++;
        while (hh <= tt && sou[Q[tt]] <= sou[i]) tt--;
        Q[++tt] = i;
        tar[i] = sou[Q[hh]];
    }
}

void getMin(int tar[], int sou[], int len)
{
    hh = 0, tt = -1;
    for (int i = 1; i <= len; i++)
    {
        if (hh <= tt && Q[hh] <= i - n) hh++;
        while (hh <= tt && sou[Q[hh]] >= sou[i]) tt--;
        Q[++tt] = i;
        tar[i] = sou[Q[hh]];
    }
}

int main()
{
    scanf("%d%d%d", &a, &b, &n);
    for (int i = 1; i <= a; i++)
        for (int j = 1; j <= b; j++)
            scanf("%d", &W[i][j]);

    for (int i = 1; i <= a; i++)
    {
        getMax(RMX[i], W[i], b);
        getMin(RMN[i], W[i], b);
    }

    int res = INT_MAX;
    for (int j = n; j <= b; j++)
    {
        for (int i = 1; i <= a; i++) C[i] = RMX[i][j];
        getMax(CMX, C, a);

        for (int i = 1; i <= a; i++) C[i] = RMN[i][j];
        getMin(CMN, C, a);

        for (int i = n; i <= a; i++) res = min(res, CMX[i] - CMN[i]);
    }

    printf("%d\n", res);

    return 0;
}
2024/9/8 17:51
加载中...