【子矩阵——优先队列】

题目

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e3 + 10;
const int mod = 998244353;
int g[N][N], ymax[N][N], ymin[N][N];
deque<int> qxmax[N], qxmin[N], qymax[N], qymin[N];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n, m, a, b;
    cin >> n >> m >> a >> b;

    // 初始化矩阵
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> g[i][j];
        }
    }

    // 垂直方向的滑动窗口(按列计算)
    for (int j = 1; j <= m; j++) {
        for (int i = 1; i <= n; i++) {
            // 最大值队列
            while (!qymax[j].empty() && g[qymax[j].back()][j] <= g[i][j]) qymax[j].pop_back();
            qymax[j].push_back(i);

            // 最小值队列
            while (!qymin[j].empty() && g[qymin[j].back()][j] >= g[i][j]) qymin[j].pop_back();
            qymin[j].push_back(i);

            // 窗口内数据有效
            if (i >= a) {
                if (i - qymax[j].front() + 1 > a) qymax[j].pop_front();
                if (i - qymin[j].front() + 1 > a) qymin[j].pop_front();
                ymax[i][j] = g[qymax[j].front()][j]; // 存储具体值
                ymin[i][j] = g[qymin[j].front()][j]; // 存储具体值
            }
        }
    }

    // 水平方向的滑动窗口(按行计算)
    ll res = 0;
    for (int i = a; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            // 最大值队列
            while (!qxmax[i].empty() && ymax[i][qxmax[i].back()] <= ymax[i][j]) qxmax[i].pop_back();
            qxmax[i].push_back(j);

            // 最小值队列
            while (!qxmin[i].empty() && ymin[i][qxmin[i].back()] >= ymin[i][j]) qxmin[i].pop_back();
            qxmin[i].push_back(j);

            // 窗口内数据有效
            if (j >= b) {
                
                if (j - qxmax[i].front() + 1 > b) qxmax[i].pop_front();
                if (j - qxmin[i].front() + 1 > b) qxmin[i].pop_front();
                
                res = (res + (ll)ymax[i][qxmax[i].front()] * ymin[i][qxmin[i].front()]) % mod;
            }
        }
    }

    // 输出结果
    cout << res << endl;

    return 0;
}
相关推荐
IT猿手35 分钟前
2025最新群智能优化算法:海市蜃楼搜索优化(Mirage Search Optimization, MSO)算法求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab·机器人
IT猿手3 小时前
2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
人工智能·python·算法·数学建模·matlab·智能优化算法
Dream it possible!6 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
修己xj7 小时前
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
算法
开心比对错重要7 小时前
leetcode69.x 的平方根
数据结构·算法·leetcode
美狐美颜sdk7 小时前
什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
人工智能·深度学习·算法·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
m0_461502698 小时前
【贪心算法1】
算法·贪心算法
Doopny@8 小时前
数字组合(信息学奥赛一本通-1291)
数据结构·算法·动态规划
原来是猿8 小时前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
项目申报小狂人9 小时前
高性能算法NGO!北方苍鹰优化算法(Northern Goshawk Optimization,NGO)
算法·数学建模