P9905 [COCI 2023/2024 #1] AN2DL 【矩阵区间最大值】

文章目录

    • 题目大意
      • 1.输入格式
      • 2.输出格式
      • 3.数据范围与约定
    • 思路
      • 维护每一行区间
      • 维护每一列区间
      • 维护区间最大值
      • code↓
    • 完结撒花( ̄▽ ̄) /

题目大意

给定 n , m , r , s n,m,r,s n,m,r,s 和一个 n × m n\times m n×m 的整数矩阵 A A A,求它每个 r × s r\times s r×s 的子矩阵的元素最大值。

1.输入格式

第一行两个整数 n , m n,m n,m 表示矩阵的高和宽。

接下来 n n n 行每行 m m m 个整数,表示矩阵 A A A

最后一行两个整数 r , s r,s r,s

2.输出格式

n − r + 1 n-r+1 nr+1 行,每行 m − s + 1 m-s+1 ms+1 个数,第 i i i j j j 列的数表示以 ( i , j ) (i,j) (i,j) 为左上角的 r × s r\times s r×s 的子矩阵元素的最大值,即 max ⁡ i ≤ x ≤ i + r − 1 , j ≤ y ≤ j + s − 1 A x , y \max\limits_{i\leq x\leq i+r-1,j\leq y\leq j+s-1}A_{x,y} ixi+r1,jyj+s1maxAx,y

3.数据范围与约定

对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 4000 1\leq n,m\leq 4000 1n,m4000 ∣ A i , j ∣ ≤ 10000 \lvert A_{i,j}\rvert\leq 10000 Ai,j10000 1 ≤ r ≤ n 1\leq r\leq n 1rn 1 ≤ s ≤ m 1\leq s\leq m 1sm

子任务特殊性质分值
1 1 1 n , m ≤ 40 n,m\leq 40 n,m40 r = n r=n r=n s = m s=m s=m 12 12 12
2 2 2 n , m ≤ 40 n,m\leq 40 n,m40 17 17 17
3 3 3 n , m ≤ 1000 n,m\leq 1000 n,m1000 25 25 25
4 4 4无特殊性质 56 56 56

思路

这道题我们可以用单调队列来维护矩阵最大值和矩阵最小值

先维护每一排的区间 ( i ∼ i + r ) (i\sim i+r) (ii+r)的最大值

可以用code来输出区间的起始值↓

#include <bits/stdc++.h>
using namespace std;
int main(){int n,m,r,s;cin>>n>>m>>r>>s;for(int i=1;i<=n-r+1;i++){for(int j=1;j<=m-s+1;j++){cout<<"("<<i<<","<<j<<")"<<endl;}}return 0;
}

运行结果如下↓

在这里插入图片描述
此图中的 ( x , y ) (x,y) (x,y)就是区间起始点

例如 ( 2 , 3 ) (2,3) (2,3)就如下图↓
在这里插入图片描述
图中用红色方框框起来的便是 ( 2 , 3 ) (2,3) (2,3)表示的整个区间

其中 × \times ×标起来的地方便是区间起始点,也就是 ( 2 , 3 ) (2,3) (2,3)

维护每一行区间

我们要维护每一列的最大值,而每一列区间起始点可用代码输出↓

#include <bits/stdc++.h>
using namespace std;
int main(){int n,m,r,s;cin>>n>>m>>r>>s;for(int i=1;i<=n;i++){for(int j=1;j<=m-s+1;j++){cout<<"("<<i<<","<<j<<")"<<endl;}}return 0;
}

运行结果如下↓

在这里插入图片描述
在如下图可用 × \times ×表示,下图用 × \times ×依次表示了 ( 1 , 1 ) (1,1) (1,1) ( 2 , 2 ) (2,2) (2,2) ( 3 , 3 ) (3,3) (3,3) ( 4 , 1 ) (4,1) (4,1)横排区间所在的起始点
在这里插入图片描述

维护每一列区间

我们要维护每一列区间的最大值,而每一列区间起始点可用代码输出↓

#include <bits/stdc++.h>
using namespace std;
int main(){int n,m,r,s;cin>>n>>m>>r>>s;for(int i=1;i<=n;i++){for(int j=1;j<=m-s+1;j++){cout<<"("<<i<<","<<j<<")"<<endl;}}return 0;
}

在如下图可用 × \times ×表示,下图用 × \times ×依次表示了 ( 1 , 1 ) (1,1) (1,1) ( 2 , 2 ) (2,2) (2,2) ( 3 , 3 ) (3,3) (3,3) ( 1 , 4 ) (1,4) (1,4) ( 2 , 5 ) (2,5) (2,5)竖列区间所在的起始点
在这里插入图片描述

维护区间最大值

整个区间的最大值都会集中在code↓

	for(int i=1;i<=n-r+1;i++)for(int j=1;j<=m-s+1;j++)

如下图↓
在这里插入图片描述
图中的 × \times ×表示的就是区间最大值所在的位置

只需要将纵列单调队列横排单调队列进行合并即可,其中ans[]数组便是用来存储区间最大值的数组

code↓

#include <bits/stdc++.h>
using namespace std;
int n,m,a[4005][4005],ans[4005][4005],r,s,b[4005][4005];//ans是答案数组,n行,m列,求r行,s列的矩阵最大值
int main(){cin>>n>>m;ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];//输入初始矩阵}}cin>>r>>s;//输入需要求的矩阵的行数和列数for(int i=1;i<=n;i++){deque<int> mx;//定义一个单调队列,用来存储横排的序号for(int j=1;j<=m;j++){while(!mx.empty()&&a[i][mx.back()]<=a[i][j]) mx.pop_back();//判断是否非空,满足单调性mx.push_back(j);//将j给压入mx这个队列while(!mx.empty()&&mx.front()<=j-s) mx.pop_front();//队列的头不在这个区间内,将它弹出if(j>=s) b[i][j-s+1]=a[i][mx.front()]; //求出a[i][j]~a[i][j+s]这个区间中的最大值}}for(int j=1;j<=m-s+1;j++){//区间的竖列起点是1~(m-s+1)deque<int> mn;//定义一个单调队列,用来存储竖列的序号for(int i=1;i<=n;i++){while(!mn.empty()&&b[mn.back()][j]<=b[i][j]) mn.pop_back();//判断是否非空,用竖列的序号去满足单调性mn.push_back(i);//将j压入mn这个序列while(!mn.empty()&&mn.front()<=i-r) mn.pop_front();//求出竖列中的区间最大值if(i>=r) ans[i-r+1][j]=b[mn.front()][j];//这里是求出数列中的区间最大值,ans数组来进行存储,最后输出就行}		}for(int i=1;i<=n-r+1;i++){//横列开始的起点for(int j=1;j<=m-s+1;j++){//竖列开始的起点cout<<ans[i][j]<<' ';//输出答案}cout<<endl;}return 0;
}

完结撒花( ̄▽ ̄) /

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/500022.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】回溯法解题20240301

这里写目录标题 一、78. 子集1、nums [1,2,3]为例把求子集抽象为树型结构2、回溯三部曲 二、90. 子集 II1、本题搜索的过程抽象成树形结构如下&#xff1a; 三、39. 组合总和1、回溯三部曲2、剪枝优化 四、LCR 082. 组合总和 II1、思路2、树形结构如图所示&#xff1a;3、回溯…

《互联网的世界》第三讲-tcp

dns 找到了地址&#xff0c;spf 确定了路径&#xff0c;如何运输数据呢&#xff1f;今天讲 tcp。 计算机网络领域的特定技术是最后当你干这个事时才要用的&#xff0c;我对孩子们这样说&#xff0c;实际上你可以随便看一个快递单子来理解端到端传输协议。 源地址&#xff0c…

图像分割 - 查找图像的轮廓(cv2.findContours函数)

1、前言 轮廓,是指图像中或者物体的外边缘线条。在简单的几何图形中,图形的轮廓是由平滑的线条构成,容易被识别。但不规则的图形或者生活中常见的物体轮廓复杂,识别起来比较困难 2、findContours函数 这里先介绍函数的参数,具体的含义会在下面实验中阐述 opencv 提供的轮…

react 原理揭秘

1.目标 A. 能够知道setState()更新数据是异步的 B. 能够知道JSX语法的转化过程 C. 能够说出React组件的更新机制 D. 能够对组件进行性能优化 E. 能够说出虚拟DOM和Diff算法 2.目录 A. setState()的说明 B. JSX语法的转化过程 C. 组件更新机制 D. 组件性能优化 E. 虚拟DOM和D…

VL53L8CX驱动开发(1)----驱动TOF进行区域检测

VL53L8CX驱动开发----1.驱动TOF进行区域检测 概述视频教学样品申请源码下载主要特点硬件准备技术规格系统框图应用示意图区域映射生成STM32CUBEMX选择MCU 串口配置IIC配置LPn 设置X-CUBE-TOF1串口重定向代码配置Tera Term配置演示结果 概述 VL53L8CX是一款8x8多区域ToF测距传感…

centos物理电脑安装过程(2024年1月)

开机时&#xff1a;CtrlAltDelete键重启电脑 重启开始时&#xff1a;按F11&#xff0c;桌面弹出蓝色框&#xff0c;选择第二个SSK SFD142 1.00&#xff0c;回车 选择install centos7安装 选择后弹出选择安装选项&#xff0c;选择语言 连接无线网络 安装设置&#xff0c;选择磁…

数字生活的未来:Web3如何改变我们的日常

随着技术的飞速发展&#xff0c;我们的生活正变得日益数字化。而Web3作为一种新型的互联网模式&#xff0c;正以前所未有的方式改变着我们的日常生活。在本文中&#xff0c;我们将深入探讨Web3技术的特点以及它如何改变我们的数字生活。 1. Web3的特点 Web3是基于区块链技术和…

基于Siamese网络的zero-shot意图分类

原文地址&#xff1a;Zero-Shot Intent Classification with Siamese Networks 通过零样本意图分类有效定位域外意图 2021 年 9 月 24 日 意图识别是面向目标对话系统的一项重要任务。意图识别(有时也称为意图检测)是使用标签对每个用户话语进行分类的任务&#xff0c;该标签…

指针的传递使用场景

C语言函数调用时为值传递&#xff0c;实参赋值给形参&#xff0c;形参值改变不会影响实参&#xff08;原理&#xff1a;两个参数地址不同&#xff09;&#xff0c;若要函数改变实参值&#xff0c;应当传递实参的地址&#xff0c;参考以下实例。 代码展示&#xff1a; #includ…

MySQL-MHA搭建、故障测试

一、架构说明 MHA&#xff08;Master High Availability&#xff09;是一个用于 MySQL 主从复制管理和自动故障转移的开源工具集。MHA 的主要目的是提供 MySQL 环境的高可用性和自动故障转移功能&#xff0c;确保在主库发生故障时能够快速切换到备库&#xff0c;降低业务中断时…

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…

「MySQL」增删查改

在操作数据库中的表时&#xff0c;需要先使用该数据库&#xff1a; use database;新增 创建表 先用 use 指定一个数据库,然后使用 create 新增一个表 比如建立一个学生表 mysql> use goods; mysql> create table student(-> name varchar(4),-> age int,-> …