单调队列求debug,玄关
查看原帖
单调队列求debug,玄关
1036180
ChampionCyan楼主2025/1/15 21:01
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int m[MAXN][MAXN];
int mxi[MAXN][MAXN], mni[MAXN][MAXN], mxj[MAXN][MAXN], mnj[MAXN][MAXN];
deque<int> q;
int main() {
    int a, b, n, ans = (int)2e9;
    scanf("%d%d%d", &a, &b, &n);
    for (int i = 1; i <= a; i++)
        for (int j = 1; j <= b; j++)
            scanf("%d", &m[i][j]);
    for (int i = 1; i <= a; i++) {
        q.clear();
        for (int j = 1; j <= b; j++) {
            while (!q.empty() && q.front() + n <= j)
                q.pop_front();
            while (!q.empty() && m[i][q.back()] <= m[i][j])
                q.pop_back();
            q.push_back(j);
            if (j >= n)
                mxi[i][j - n + 1] = m[i][q.front()];
        }
        q.clear();
        for (int j = 1; j <= b; j++) {
            while (!q.empty() && q.front() + n <= j)
                q.pop_front();
            while (!q.empty() && m[i][q.back()] >= m[i][j])
                q.pop_back();
            q.push_back(j);
            if (j >= n)
                mni[i][j - n + 1] = m[i][q.front()];
        }
    }
    for (int j = 1; j <= b - n + 1; j++) {
        q.clear();
        for (int i = 1; i <= a; i++) {
            while (!q.empty() && q.front() + n <= i)
                q.pop_front();
            while (!q.empty() && mxi[q.back()][j] <= mxi[i][j])
                q.pop_back();
            q.push_back(i);
            if (i >= n)
                mxj[i - n + 1][j] = m[q.front()][j];
        }
        q.clear();
        for (int i = 1; i <= a; i++) {
            while (!q.empty() && q.front() + n <= i)
                q.pop_front();
            while (!q.empty() && mni[q.back()][j] >= mni[i][j])
                q.pop_back();
            q.push_back(i);
            if (i >= n)
                mnj[i - n + 1][j] = m[q.front()][j];
        }
    }
    for (int i = 1; i <= a - n + 1; i++)
        for (int j = 1; j <= b - n + 1; j++)
            ans = min(ans, mxj[i][j] - mnj[i][j]);
    printf("%d\n", ans);
    return 0;
}
2025/1/15 21:01
加载中...