AcWing 4964.子矩阵

首先就是运用了暴力的思路,能够过个70%的数据,剩下的直接时间超时了,没办法优化了。

讲一下暴力的思路:

其实就是模拟而已,也就是看作想要找的矩阵为一个小窗口,然后不断移动的事而已。

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<sstream>
#include<map>
#include<limits.h>
#include<set>
#define MAX 1005
#define int long long
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
vector<int>cunchu;
int arr[MAX][MAX];
signed main() {ios::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);int n, m;int a, b;cin >> n >> m >> a >> b;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++)cin >> arr[i][j];}int sum = 0;//计算结果int left1 = 1;//这里代表的是对于上界的限制int left2 = a;//代表对于下界的限制int right1 = 1;//代表对于左边的限制int right2 = b;//代表对于右边的限制while (left2 <= n) {cunchu.clear();if (right2 > m){right1 = 1;right2 = b;left2++;left1++;continue;}for (int i = left1; i <= left2; i++) {for (int j = right1; j <= right2; j++) {cunchu.push_back(arr[i][j]);}}sort(cunchu.begin(), cunchu.end());sum += (cunchu.front() * cunchu.back()) % 998244353;right1++;right2++;}cout << sum;return 0;
}

接下来就是优化版本:

这里用的是滑动窗口问题的解决方法,也就是所谓数据结构中的单调队列,这也是需要一些数据结构基础的才能接受的知识点。

思路:单调队列讲究的就是一个单调,我们可以先套用单调队列的模板,可以参考一下y总的模板,作者的模板也是跟y总学的,建议首先理解,然后自己敲出来。

我们想,在给定的大矩阵当中,我们从中随便选一块小矩阵的大小,我们要求它的最大值最小值,如果要是暴力的话,复杂度肯定是n**2,而单调队列可以降到n,在求最值的时候我们尝试用单调队列进行求出。但是,我们以往用的单调队列都是线性的,也就是一维的,但不是二维的,怎么办?这样我们可以换个思路,可以从前面写的那个二维双指针可以知道,我们可以把二维问题变成一维的,也就是说,首先固定两个相对的边界。

假设我们这里就首先固定了左右边界,这个时候列数是不是就是小矩阵的长呢?可以自己画图看一下。这个时候,如果说我们先求出来每一行的最大值,再来求每一列的最小值,这两个过程是不是都是线性的呢?是的,这个时候我们的单调队列才派上用场。

对于每一行的最值求完之后,我们还需要对于这些最值中再求最值,这样才能是小矩阵的最值,所以又需要用一次单调队列,这样虽然麻烦,但是效率却是很高的。OK,核心思路就到这里

上代码:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<sstream>
#include<map>
#include<limits.h>
#include<set>
#define MAX 1005
#define int long long
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
vector<int>cunchu;
int arr[MAX][MAX];//存储的大矩阵
int rmax[MAX][MAX], rmin[MAX][MAX];//对于第i-1行的每一个长度为b的窗口求最大/小值
int q[MAX];//队列
int one[MAX], two[MAX], three[MAX];//用来存储列的最值的
void get_max(int a[], int b[], int total, int qujian) {int front = 0;int rear = -1;for (int i = 0; i < total; i++) {if (front <= rear && q[front] + qujian <= i)front++;//当前队头滑出窗口while (front <= rear && a[q[rear]] <= a[i])rear--;//队尾元素比进来的元素小,那么我们就开始更新q[++rear] = i;if (i >= qujian - 1)//滑动窗口已经完全在数组里面进行滑动了,就开始统计每个窗口的最大值。b[i] = a[q[front]];}
}
void get_min(int a[], int b[], int total, int qujian) {int front = 0;int rear = -1;for (int i = 0; i < total; i++) {if (front <= rear && q[front] <= i - qujian)front++;while (front <= rear && a[q[rear]] >= a[i])rear--;q[++rear] = i;if (i >= qujian - 1)b[i] = a[q[front]];}
}
signed main() {ios::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);int n, m;int a, b;cin >> n >> m >> a >> b;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++)cin >> arr[i][j];}for (int i = 0; i < n; i++) {get_max(arr[i], rmax[i], m, b);//对于每一行的每一个长度为b的窗口求最大值get_min(arr[i], rmin[i], m, b);//对于每一行的每一个长度为b的窗口求最小值}int count = 0;//用来统计积的和//这里的外循环是对于列的遍历,内循环才是对于行的遍历for (int i = b-1; i < m; i++) {//为什么初值是b-1呢?这个时候窗口的队头才是i=0,初值不是b-1的话,窗口是不满的for (int j = 0; j < n; j++) one[j] = rmax[j][i];//这个时候我们对于每一行的当前窗口的最大值进行存储get_max(one, two, n, a);//这里是对于这些行的最大值再进行求最大值,也就是小矩阵的最大值了for (int j = 0; j < n; j++)one[j] = rmin[j][i];//同理,求最小值get_min(one, three, n, a);for (int j = a - 1; j < n; j++) {//为什么这里用a-1当初值呢?其实也是窗口的问题,如果纵向看,窗口的宽就是a了,如果初值不是a-1,窗口也是不满的count = (count + two[j] * three[j]) % 998244353;//这样就是对于所有小矩阵的最值进行相乘然后相加取模了}}cout << count;return 0;
}

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

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

相关文章

服务器远程端口故障应该如何解决并且避免

在信息化快速发展的今天&#xff0c;服务器作为支撑各类业务运行的核心设备&#xff0c;其稳定性对于企业的运营至关重要。然而&#xff0c;即使是最高端的服务器也难免会出现问题&#xff0c;其中“服务器远程端口故障”就是一个相对常见但又十分棘手的问题。德迅云安全今天就…

云计算 3月15号(linux的权限管理 进程管理 管道重定向 磁盘管理 文件查找 软件管理 计划任务 web服务器 配置文件)

一、走进Linux 服务器类型&#xff1a;塔式服务器、刀片式服务器、机架式服务器 服务器基建&#xff1a;云服务器、物理服务器、虚拟服务器、容器 操作系统&#xff1a;centos、ubuntu、debain、欧拉、龙蜥、银河麒麟、中标麒麟 # 修改时区 timedatectl set-timezone Asia/Shan…

Ansible非标记语言YAML与任务剧本Playbook

前言 上篇介绍了 Ansible 单模块&#xff08;AD-Hoc&#xff09;的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客&#xff0c;Ad-Hoc 命令是一次性的、即时执行的命令&#xff0c;用于在远程主机上执行特定任务&#xff0c;这些命令通常用于快速执行简单的任务。当需要…

MS08-067 漏洞利用与安全加固

文章目录 环境说明1 MS08_067 简介2 MS08_067 复现过程3 MS08_067 安全加固 环境说明 渗透机操作系统&#xff1a;2024.1漏洞复现操作系统: Windows XP Professional with Service Pack 2- VL (English)安全加固复现操作系统&#xff1a;Windows XP Professional with Service …

C语言案例2,请编程序将“China“译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母,变为Glmre,持续更新~

一.题目 /* 请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”&#xff0c;用“E”代替“A”。因此,“China”应译为“Glmre”。 请编一程序,用赋初值的方法使cl,c2&#xff0c;c3,c4,c5 这5个变量的值分…

YoloV5改进策略:下采样改进|HWD改进下采样

摘要 本文使用HWD改进下采样&#xff0c;在YoloV5的测试中实现涨点。 论文解读 在卷积神经网络&#xff08;CNNs&#xff09;中&#xff0c;极大池化或跨行卷积等下采样操作被广泛用于聚合局部特征、扩大感受野和最小化计算开销。然而&#xff0c;对于语义分割任务&#xff…

HTML_CSS练习:HTML注释

一、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>HTML注释</title> </head> <body><marquee loop"1">马龙强<!--下面的输入框是可以滚动的&#x…

【Python】清理conda缓存的常用命令

最近发现磁盘空间不足&#xff0c;很大一部分都被anaconda占据了&#xff0c;下面是一些清除conda缓存的命令 清理所有环境的Anaconda包缓存 删除所有未使用的包以及缓存的索引和临时文件 conda clean --all清理某一特定环境的Anaconda包缓存 conda clean --all -n 环境名清…

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubVersion 构建工具&#xff1a;maven、Ant、Gradle 自动部署&#xff1a;Capistrano、CodeDeploy 持续…

生产环境中间件服务集群搭建-zk-activeMQ-kafka-reids-nacos

环境&#xff1a; 系统&#xff1a;centos7.9 工作目录&#xff1a;/home 安装包位置&#xff1a;/home/op/tools 1.系统初始化 安装依赖环境 yum -y install net-tools vim screen telnet vim gcc gcc-c 修改主机名&#xff0c;为另外两台添加hosts文件 [rootmq01 conf…

开源数据库 OpenGauss 的 SQL 解析源码分析

开源数据库 OpenGauss 的 SQL 解析源码分析 openGauss 数据库体系概述 openGauss 是关系型数据库&#xff0c;采用客户端/服务器&#xff0c;单进程多线程架构&#xff1b;支持单机和一主多备部署方式&#xff0c;同时支持备机可读、双机高可用等特性。 从代码结构体系结构的…

字符串函数(C语言详解)

1.字符串简介 字符串是一串连续的且以\0结尾的字符 char arr[]"zhangsan";//将字符串存到数组里面 char*a"lisi";//常量字符串 char arr1[]{z,h,a,n,g};//字符数组 注意&#xff1a; 1.以第一种形式初始化字符串时&#xff0c;计算机会自动在字符串末尾加…

GraspNet-baseline复现----Linux-Ubuntu

1.基本环境 Ubuntu 20.04Cuda 11.0 、cuDNN 80.0Python 3.7.16PyTorch 1.7.0 2.环境配置 PyTorch的版本对Cuda和Python的版本都有依赖&#xff0c;所以基本步骤是 确定需要安装的PyTorch版本 —> 通过 网站 确定对应的cuda版本和python版本 —> 创建虚拟环境配置环境。…

Node.js基础+原型链污染

Node.js基础 概述&#xff1a;简单来说Node.js就是运行在服务端的JavaScript&#xff0c;Node.js是一个基于Chrome JavaScript运行时建立的一个平台 大小写变换&#xff1a; toUpperCase&#xff08;&#xff09;&#xff1a;将小写字母转为大写字母&#xff0c;如果是其他字…

Docker——问题解决:服务器端和Windows端IP互通

踩了大坑&#xff0c;特此记录&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我在服务器端部署了服务&#xff0c;但是在本地端Windows机器上无法访问&#xff0c;因此卡了一天。 1. 双向Ping通 防火墙导致只能单向Ping通 首先需要解决双向ping通的问题&…

构建部署_docker-compose常用命令

构建部署_docker-compose常用命令 前言简介docker-compose 常用命令docker-compose安装编写配置文件docker-compose.yml文件生成镜像容器 前言 使用一个Dockerfile模板文件可以定义一个单独的应用容器&#xff0c;如果需要定义多个容器就需要服务编排。下面介绍Docker官方产品…

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

使用FFmpeg源码配置程序configure查看所有支持的编码器/解码器/封装/解封装及网络协议

查看支持编码器: configure --list-encoders 查看支持编码器: configure --list-decoders 查看所有支持的封装: configure --list-muxers 查看所有支持的解封装: configure --list-demuxers 查看所有支持的网络通信协议: configure --list-protocols

解决jsp request.getParameter乱码问题(兼容Tomcat 6~8三个版本)

JSP页面写法&#xff1a; <% page contentType"text/html; charsetutf-8" language"java" %> <% page import"java.io.*" %> <%! int getServerVersion(HttpServletRequest request) {ServletContext application request.getS…

移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展

科技的飞速发展&#xff0c;为我们的生活带来了诸多便利&#xff0c;从传统的家电产品到智能化的家居设备&#xff0c;我们的居家生活正朝着更智能、更便捷的方向变革。 3月14日&#xff0c;中国家电及消费电子博览会&#xff08;Appliance&electronics World Expo&#xf…