蓝桥杯2023年第十四届省赛真题-子矩阵

题目来自DOTCPP:

暴力思路(两个测试点超时):

题目要求我们求出子矩阵的最大值和最小值的乘积,我们可以枚举矩阵中的所有点,以这个点为其子矩阵的左上顶点,然后判断一下能不能构成子矩阵。如果可以,我们在遍历这个子矩阵,求出子矩阵的最大值和最小值,将它加起来。同时,由于题目告诉我们答案可能非常大,即使我们用long long 类型来存答案,也会溢出。因此,我们答案每次加上子矩阵的最小值和最大值的乘积后,可以对998244353 取模,这样可以保证最终答案数据不会溢出。

暴力代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1020;int n, m, a, b;
int arr[N][N];signed main(){cin >> n >> m >> a >>b;for(int i =1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> arr[i][j];}}int s = 0;//枚举矩阵每个点for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(i+a-1 > n || j+b-1 > m) continue;int ssmin= 1e9+10, ssmax = -1;//找到矩阵中的最大值和最小值for(int k = i; k <= i+a-1; k++){for(int l = j; l <= j+b-1; l++){int x = arr[k][l];ssmax = max(ssmax, x);ssmin = min(ssmin, x);// cout << ssmin << " " << ssmax << endl;}}s += ssmax * ssmin;//题目说了答案非常大 即使是long long 类型也会溢出//所以我们每次的答案%998244353s = s%998244353;// cout << ssmin << "*" << ssmax << endl;}}cout << s  << endl;return 0;
}

优化思路-滑动窗口+单调队列:

暴力代码的思路是枚举每个点,将这个点当成子矩阵的左上角顶点,然后找到子矩阵最小值和最大值,答案加上最小值和最大值的乘积。我们可以对找到子矩阵的最小值和最大值优化,就不会超时了。

窗口每一次都是从一行的最左边或每一列的上边开始出发:

①我们先对矩阵的每一行,让长度为b的窗口开始滑动,找到这一行的最小值和最大值,赋给该窗口的左顶点。

②我们在对矩阵的每一列,让长度为a的窗口开始滑动,找到这一列的最小值和最大致,赋给该窗口的上顶点。

③也就是说,左上角这个顶点是这个矩阵的最小值和最大值。

容易错误的点:

①对矩阵的每一列操作,是在行处理后,找到最小值或最大值基础上,在对列进行操作,找到最小值和最大值。而不是对原数组arr,找到原数据的最小值和最大值。

②我们是先对每一行求得子矩阵的最小值和最大值,在这个基础上,再求每一列的最小值和最大值。因此,每一列的最小值和最大值是我们需要的,我们不能把每一行的最小值和最大值、每一列的最小值和最大值放在一起。我们需要的是每一列的最小值和最大值,要分开存数据。

滑动窗口+单调队列代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1010;int n, m ,a , b;
int arr[N][N];
//队列中存的是整数在数组的下标
int q[N]; //数组模拟队列
int hh ,tt; //队头指针 队尾指针
int ssmax[N][N], ssmax_col[N][N];
int ssmin[N][N], ssmin_col[N][N];signed main(){cin >> n >> m >> a>> b;for(int i = 1; i <=n; i++){for(int j = 1; j <= m; j++){cin >> arr[i][j];}}//最小值-行//窗口的最左边为该窗口的最小值 for(int i = 1; i <= n; i++){//队头指针 队尾指针 初始化hh = 1, tt = 0;for(int j = 1;j <= m; j++){//保证队列数组从小到大的单调性while(hh <= tt && arr[i][j] < arr[i][q[tt]]) tt--;//将更小的数覆盖之前的位置q[++tt] = j;//保证窗口长度不超过bif(j-q[hh]+1 > b) hh ++;//当窗口长度为b时候,最小值付给最左边位置if(j>=b) ssmin[i][j-b+1] = arr[i][q[hh]];}}//要基于行的操作//最小值-列for(int j = 1; j <= m; j++){hh = 1, tt = 0;for(int i = 1; i <= n; i++){while(hh <= tt && ssmin[i][j] < ssmin[q[tt]][j]) tt--;q[++tt] = i;if(i-q[hh]+1 > a)hh++;if(i >=a)ssmin_col[i-a+1][j] = ssmin[q[hh]][j];}}//最大值-行//窗口的最左边为该窗口的最大值 for(int i = 1; i <= n; i++){//队头指针 队尾指针 初始化hh = 1, tt = 0;for(int j = 1;j <= m; j++){//保证队列数组从大到小的单调性while(hh <= tt && arr[i][j] > arr[i][q[tt]]) tt--;//将更大的数覆盖之前的位置q[++tt] = j;//保证窗口长度不超过bif(j-q[hh]+1 > b) hh ++;//当窗口长度为b时候,最大值付给最左边位置if(j>=b) ssmax[i][j-b+1] = arr[i][q[hh]];}}//基于行的操作基础//最大值-列for(int j = 1; j <= m; j++){hh = 1, tt = 0;for(int i = 1; i <= n; i++){while(hh <= tt && ssmax[i][j] > ssmax[q[tt]][j]) tt--;q[++tt] = i;if(i-q[hh]+1 > a)hh++;if(i >=a)ssmax_col[i-a+1][j] = ssmax[q[hh]][j];}}int ans = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){ans += (ssmin_col[i][j] * ssmax_col[i][j]) % 998244353 ;}}cout << ans % 998244353<< endl;return 0;
}

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

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

相关文章

centos 磁盘重新分割,将原来/home 下部分空间转移到 / 根目录下

上次重装系统时&#xff0c;不小心将一半磁盘放在了 /home 下面&#xff0c;运行一段时间后&#xff0c;发现/home 空间没有怎么用&#xff0c;反而是/ 目录报警说磁盘用完了&#xff0c;准备将 /home下的空间分一部分给主目录 / 先查看下 空间分布情况 df -lh 可以看到&…

【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“

文章目录 ⭐前言⭐一、同步编程&#xff1a;单线程的线性世界&#x1f31f;1、寻找合适的对象✨1) &#x1f31f;7、设计应支持变化 ⭐二、异步编程&#xff1a;多任务的协奏曲⭐三、async/await工作原理揭秘⭐四、最佳实践与性能陷阱⭐五、异步编程适用场景⭐六、性能对比实测…

Redis命令详解--集合

Redis set 是string类型的无序集合。集合成员是唯一的&#xff0c;这就意味着集合中不能出现重复的数据&#xff0c;常用命令&#xff1a; SADD key member1 [member2...] 向集合添加一个或多个成员 SREM key member1 [member2...] 移除集合中一个或多个成员 SMEMBERS key 获…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

配置 VSCode 的 C# 开发环境

1. 安装必要的依赖 1.1 VSCode 扩展 安装 C# 相关插件&#xff08;如 C#、C# Extensions 等&#xff09;。 1.2 .NET SDK 下载地址&#xff1a;.NET SDK 下载页面 1.3 安装检测 在命令行输入以下命令&#xff0c;如果正确返回了版本号&#xff0c;则表示 .NET SDK 安装成…

从零搭建微服务项目Pro(第6-1章——Spring Security+JWT实现用户鉴权访问与token刷新)

前言&#xff1a; 在现代的微服务架构中&#xff0c;用户鉴权和访问控制是非常重要的一部分。Spring Security 是 Spring 生态中用于处理安全性的强大框架&#xff0c;而 JWT&#xff08;JSON Web Token&#xff09;则是一种轻量级的、自包含的令牌机制&#xff0c;广泛用于分…

使用HAI来打通DeepSeek的任督二脉

一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品&#xff0c;旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为&#xff1a; AI作画&#xff0c;AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB&#xff0c;这…

【保姆级】阿里云codeup配置Git的CI/CD步骤

以下是通过阿里云CodeUp的Git仓库进行CI/CD配置的详细步骤&#xff0c;涵盖前端&#xff08;Vue 3&#xff09;和后端&#xff08;Spring Boot&#xff09;项目的自动化打包&#xff0c;并将前端打包结果嵌入到Nginx的Docker镜像中&#xff0c;以及将后端打包的JAR文件拷贝至Do…

LINUX网络编程API原型详细解析

1. 网络体系 1.1. 简介 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供…

蓝桥杯 之 暴力回溯

文章目录 数字接龙小u的最大连续移动次数问题迷宫 在蓝桥杯中&#xff0c;十分喜欢考察对于网格的回溯的问题&#xff0c;对于这类的问题&#xff0c;常常会使用到这个DFS和BFS进行考察&#xff0c;不过无论怎么考察&#xff0c;都只是会在最基础的模本的基础上&#xff0c;根据…

微信小程序的业务域名配置(通过ingress网关的注解)

一、背景 微信小程序的业务域名配置&#xff08;通过kong网关的pre-function配置&#xff09;是依靠kong实现&#xff0c;本文将通过ingress网关实现。 而我们的服务是部署于阿里云K8S容器&#xff0c;当然内核与ingress无异。 找到k8s–>网络–>路由 二、ingress注解 …

Python数据可视化工具:六西格玛及其基础工具概览

在当今数据驱动的时代&#xff0c;数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛&#xff08;Six Sigma&#xff09;作为一种以数据为基础、追求完美质量的管理理念&#xff0c;其实施依赖于一系列基础工具的灵活运用。而Python&#xff0c;凭借其强…

集群环境下Redis 商品库存系统设计

目录 环境实现基本结构代码业务代码主体库存管理模块 后续问题高并发临界值与乐观锁问题 完整代码总结后话 环境 我们现在要做商品秒杀系统。功能很简单&#xff0c;就是库存删减。用户先下单减库存&#xff0c;之后再进行扣款。 实现 基本结构代码 那么我们先看下如何搭建…

Spring MVC响应数据

handler方法分析 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: handler作用总结:* 1.接收请求参数(param,json,pathVariable,共享域等…

基于图像识别的医学影像大数据诊断系统的设计与实现

标题:基于图像识别的医学影像大数据诊断系统的设计与实现 内容:1.摘要 随着医学影像技术的快速发展&#xff0c;医学影像数据量呈爆炸式增长&#xff0c;传统的人工诊断方式在处理海量数据时效率低下且容易出现误差。本研究的目的是设计并实现一个基于图像识别的医学影像大数据…

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…

【redis】在 Spring中操作 Redis

文章目录 基础设置依赖StringRedisTemplate库的封装 运行StringList删库 SetHashZset 基础设置 依赖 需要选择这个依赖 StringRedisTemplate // 后续 redis 测试的各种方法&#xff0c;都通过这个 Controller 提供的 http 接口来触发 RestController public class MyC…

微服务》》Kubernetes (K8S) 集群 安装

关闭交换空间 # 切换 超级管理员身份 # 查看交换空间 free -h # 关闭交换空间 swapoff -a避免开启启动交换空间 # 注释swap开头的行 vim /etc/fstab关闭防火墙 # 关闭防火墙 # 因为K8S 是集群形式存在的 至少三台 一主二从 &#xff08;一个master 两个node&#xff09…

HTTP和RPC的区别

RPC和 HTTP是两种常见的通信方式&#xff0c;它们在设计目标、使用场景和技术实现上有显著区别。以下是它们的详细对比&#xff1a; 1. 定义与核心思想 特性RPCHTTPRemote Procedure Call远程过程调用HyperText Transfer Protocol超文本传输协议定义一种协议或框架&#xff0…

MySQL 简记

MySQL 简记 mysql中的数据存储的结构是B树 其与B树的相同点是&#xff0c;B树一个节点也可以存放多条数据&#xff0c;并且从左到右依次增大&#xff1b;不同点是&#xff0c;B树的叶子结点之间也能相互连接。那么实际上是采取利用空间换区时间的策略。 那么B树的树结构like…