当前位置: 首页 > article >正文

【子矩阵——优先队列】

题目

代码

#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;
}


http://www.kler.cn/a/514826.html

相关文章:

  • Leecode刷题C语言之从栈中取出K个硬币的最大面积和
  • node.js 07.npm下包慢的问题与nrm的使用
  • Java 设计模式一
  • 聚类OTU vs 降噪识别生物序列——谁将主宰扩增子领域未来
  • CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅
  • Markdown Viewer 浏览器, vscode
  • 如何为64位LabVIEW配置正确的驱动程序
  • 基于STM32F103驱动AD7606串行采集数据信号
  • C++之初识模版
  • 安卓APP如何适配不同的手机分辨率
  • 【动态规划】--- 斐波那契数模型
  • 短剧系统开发功能需求/APP开发/源码指南
  • 计算在不规则形状内不同结构的占比
  • winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件
  • 鸿蒙开发入门之Hello World
  • 炸场硅谷,大模型“蒸汽机”迎来“瓦特时刻”
  • 论文速读|Multi-Modal Disordered Representation Learning Network for TBPS.AAAI24
  • 错误记录(二)virtualbox连共享文件夹
  • 09_异步加载_单例模式_常量类配置_不可销毁
  • Spring MVC(二)