STL单调队列 10分 求助
查看原帖
STL单调队列 10分 求助
864920
Refrain520CC楼主2023/7/8 22:01
#include <iostream>
#include <algorithm>
#include <deque>

using namespace std;

const int INF = 0x3f3f3f3f, N = 1e3 + 5;

int n, m, k, ans = INF;
int g[N][N];
int rmax[N][N], rmin[N][N], cmax[N][N], cmin[N][N]; // row行与col列统计的最值
deque<int> q, p; //用于求最大值和最小值的单调队列

signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m ; j ++)
            cin >> g[i][j];
    
    // 对每一行每一个长度为k的区间求出最大值和最小值
    for(int j = 1; j <= n; j ++)
    {
        q.clear(), p.clear();
        for(int i = 1; i <= m; i ++)
        {
            while(q.size() && i - q.front() >= k) q.pop_front();
            while(p.size() && i - p.front() >= k) p.pop_front();
            
            while(q.size() && g[j][i] > g[j][q.back()]) q.pop_back();
            while(p.size() && g[j][i] < g[j][p.back()]) p.pop_back();
            
            q.push_back(i);
            p.push_back(i);
            
            if(i >= k) {
                rmax[j][i-k+1] = g[j][q.front()];
                rmin[j][i-k+1] = g[j][p.front()];
            } 
        }
    }
    m--;
    // 在对处理后的每一列求最值
    for(int j = 1; j <= m ; j ++)
    {
        q.clear(), p.clear();
        for(int i = 1; i <= n; i ++)
        {
            while(q.size() && i - q.front() >= k) q.pop_front();
            while(p.size() && i - p.front() >= k) p.pop_front();
            
            while(q.size() && rmax[i][j] > rmax[q.front()][j]) q.pop_back();
            while(p.size() && rmin[i][j] < rmin[p.front()][j]) p.pop_back();
            
            q.push_back(i);
            p.push_back(i);
            
            if(i >= k) {
                cmax[i-k+1][j] = rmax[q.front()][j];
                cmin[i-k+1][j] = rmin[p.front()][j];
            }
        }
    }
    n--;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m ; j ++)
            ans = min(ans, cmax[i][j]-cmin[i][j]);
    cout << ans << endl;
    
    return 0;
}
2023/7/8 22:01
加载中...