【洛谷P2216】理想的正方形【单调队列】

AlphaFold2算法详解 正文:https://www.nature.com/articles/s41586-021-03819-2 补充文件:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/MediaObjects/41586_2021_3819_MOESM1_ESM.pdfhttps://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/Med 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2216
有一个 n × m n\times m n×m的整数组成的矩阵,现请你从中找出一个 k × k k\times k k×k的正方形区域,使得该区域所有数中的最大值和最小值的差最小。


思路:

朴素的想法是直接暴力枚举区间,然后枚举其中的每一位。时间复杂度 O ( n m × k 2 ) O(nm\times k^2) O(nm×k2)。
另一种思路是预处理所有边长为 k k k的矩形中的最值。时间复杂度 O ( n m × k ) O(nm\times k) O(nm×k)。
然而这两种方法都过不了。
n , m ≤ 1000 , k ≤ 100 n,m\leq 1000,k\leq 100 n,m≤1000,k≤100,显然是要一种 O ( n m ) O(nm) O(nm)的方法。
考虑单调队列。
先用单调队列处理出 h m a x [ i ] [ j ] hmax[i][j] hmax[i][j]和 h m i n [ i ] [ j ] hmin[i][j] hmin[i][j],表示第 i i i行第 j ∼ j + k − 1 j\sim j+k-1 j∼j+k−1个数的最值。显然是可以 O ( n m ) O(nm) O(nm)搞的。
然后再用一次单调队列处理出 l m a x [ i ] [ j ] lmax[i][j] lmax[i][j]和 l m i n [ i ] [ j ] lmin[i][j] lmin[i][j]但是这里表示的是第 i i i列 m a x / m i n { h m a x [ i ] [ j . . . j + k − 1 ] / h m i n [ i ] [ j . . . j + k − 1 ] } max/min\{hmax[i][j...j+k-1]/hmin[i][j...j+k-1]\} max/min{hmax[i][j...j+k−1]/hmin[i][j...j+k−1]}。
最后枚举区间,直接用 l m a x [ i ] [ j ] − l m i n [ i ] [ j ] lmax[i][j]-lmin[i][j] lmax[i][j]−lmin[i][j]来更新答案就好了。


似乎还可以用 S T ST ST表去做,时间复杂度 O ( n m × l o g   k ) O(nm\times log\ k) O(nm×log k)。


代码:

#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
using namespace std;

const int N=1010;
int n,m,k,a[N][N],hmax[N][N],hmin[N][N],lmax[N][N],lmin[N][N],ans;
deque<int> qmax,qmin;

int main()
{
	memset(hmin,0x3f3f3f3f,sizeof(hmin));
	memset(lmin,0x3f3f3f3f,sizeof(lmin));
	memset(hmax,0xcf,sizeof(hmax));
	memset(lmax,0xcf,sizeof(lmax));
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
		{
			while (qmax.size()&&qmax.front()<j-k+1) qmax.pop_front();
			while (qmax.size()&&a[i][qmax.back()]<a[i][j]) qmax.pop_back();
			qmax.push_back(j);
			if (j>=k) hmax[i][j-k+1]=max(hmax[i][j-k+1],a[i][qmax.front()]);  //单调队列常规操作
			
			while (qmin.size()&&qmin.front()<j-k+1) qmin.pop_front();
			while (qmin.size()&&a[i][qmin.back()]>a[i][j]) qmin.pop_back();
			qmin.push_back(j);
			if (j>=k) hmin[i][j-k+1]=min(hmin[i][j-k+1],a[i][qmin.front()]);
		}
		while (qmax.size()) qmax.pop_back();
		while (qmin.size()) qmin.pop_back();
	}
	for (int j=1;j<=m-k+1;j++)
	{
		for (int i=1;i<=n;i++)
		{
			while (qmax.size()&&qmax.front()<i-k+1) qmax.pop_front();
			while (qmax.size()&&hmax[qmax.back()][j]<hmax[i][j]) qmax.pop_back();
			qmax.push_back(i);
			if (i>=k) lmax[i-k+1][j]=max(lmax[i-k+1][j],hmax[qmax.front()][j]);
			
			while (qmin.size()&&qmin.front()<i-k+1) qmin.pop_front();
			while (qmin.size()&&hmin[qmin.back()][j]>hmin[i][j]) qmin.pop_back();
			qmin.push_back(i);
			if (i>=k) lmin[i-k+1][j]=min(lmin[i-k+1][j],hmin[qmin.front()][j]);
		}
		while (qmax.size()) qmax.pop_back();
		while (qmin.size()) qmin.pop_back();
	}
	ans=2147483647;
	for (int i=1;i<=n-k+1;i++)
		for (int j=1;j<=m-k+1;j++)
			ans=min(ans,lmax[i][j]-lmin[i][j]);
	printf("%d",ans);
	return 0;
}
Ollama部署本地大模型详细教程 创建ModelfilePARAMETER num_gpu 50 # GPU 层卸载比例(0~100)场景是否推荐本地开发/测试 Agent✅ 强烈推荐内部知识库问答(RAG)✅ 推荐(配合 Pgvector)生产环境高并发服务⚠️ 谨慎(建议评估 vLLM / Triton)需要 Function Calling 的 Agent❌ 不推荐(改用 DashScope API)🔑核心价值Ollama 是“本地大模型的 Docker”——让开源模型像容器一样 easy to run。 阅读详情

相关推荐

模电学习笔记(十二)——跨阻放大器

模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻。 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15V 1.计算R1的值(增益电阻器) 2.计算C1的值满足电路带宽 ...

tang11081023的博客 2万+

【题解】洛谷P2216 理想的正方形(单调队列)

一般的暴力做法的时间复杂度为O(a*b*n*n),一定会超时。其中a*b是省不掉的,所以我们可以在对n*n的区间寻找最大值和最小值内进行优化。 https://www.luogu.org/blog/denial/solution-p2216 以上是本题的解题思路,但具体如何实现这个思路,我们就需要用到单调队列了。对于X(行内最大值)和Y(列最大值)我们维护一个从大到小的单调队列,然后对于读进来...

Rem_Inory的博客 511

AHP层次分析法在项目风险评估中的实战应用(含Excel模板)

本文详细介绍了AHP层次分析法在项目风险评估中的实战应用。通过构建风险层次模型、利用判断矩阵量化主观判断,并结合Excel工具进行权重计算与一致性检验,将模糊的定性风险转化为清晰的量化排序。文章以新产品上线项目为例,提供了完整的分析流程和可操作的Excel模板,帮助项目经理高效识别并优先处理核心风险。

weixin_29061465的博客 570

1091 理想的正方形(单调队列优化)

1. 问题描述: 有一个 a×b 的整数组成的矩阵,现请你从中找出一个 n×n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。 输入格式 第一行为三个整数,分别表示 a,b,n 的值;第二行至第 a+1 行每行为 b 个非负整数,表示矩阵中相应位置上的数。 输出格式 输出仅一个整数,为 a×b 矩阵中所有“n×n 正方形区域中的最大整数和最小整数的差值”的最小值。 数据范围 2 ≤ a,b ≤ 1000, n ≤ a,n ≤ b,n ≤ 100, 矩阵中的所有数都不超过 10 ^

二哈 568

IC验证 AHB-RAM 项目(二)——接口与事务代码的编写

本文介绍了准备工作及接口、事务相关代码编写要点。在接口部分,重点说明了lvc_ahb_if.sv、rkv_ahbram_if.sv和rkv_ahbram_tb.sv三个关键文件的功能,其中rkv_ahbram_if.sv通过动态任务实现复位信号控制。事务部分则涉及lvc_ahb_types.sv中的枚举类型定义和lvc_ahb_transaction.sv中的随机化变量设置,用于构建AHB传输激励。整个验证环境采用模块化设计,通过接口实现TB与DUT的通信,为后续验证工作奠定基础。

weixin_45926435的博客 405

osgEarth shapefile矢量生成三维模型案例 2.boston.earth

osgEarth shapefile矢量生成三维模型案例 2.boston.earth 波士顿城市建筑、路灯、公园、道路shp矢量生成三维模型案例。

qq_24934183的博客 3542

【单调队列】[HAOI2007]理想的正方形(C++)

描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小。 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。 100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000 输出 仅一个整数,为ab矩阵中所有“nn正方形区域中的最大整数和最小整数的差值”的最小值。 样例 输入 5 4 2 1 2 5 6 0 17 16

liuzich的博客 526

Obsidian+llama3:终于搭建了自己的知识库

Obsidian 的 Smart Connections,超出了我原本的预期,于是结合新模型非常方便地搭建了我的个人知识库。

谢彦的技术博客 3711

H - 理想的正方形(单调队列)

有一个 a×b 的整数组成的矩阵,现请你从中找出一个 n×n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。每行相邻两数之间用一空格分隔。仅一个整数,为 a×b 矩阵中所有“ n×n 正方形区域中的最大整数和最小整数的差值”的最小值。100% 的数据 2≤a,b≤1000,n≤a,n≤b,n≤100。20% 的数据 2≤a,b≤100,n≤a,n≤b,n≤10。第一行为 3 个整数,分别表示 a,b,n 的值。矩阵中的所有数都不超过 1,000,000,000。

q619718的博客 179

S32DS使用手把手教程:从零实现CAN通信配置

深入讲解S32DS使用过程中如何从零开始配置CAN通信,涵盖关键步骤与实用技巧,帮助开发者快速上手S32DS使用中的常见问题与调试方法。

weixin_42405592的博客 1124

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3160

【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)

点此看题面 大致题意: 求出一个矩阵中所有n∗nn*nn∗n正方形中极差的最小值。 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维RMQRMQRMQ。 二维RMQRMQRMQ RMQRMQRMQ相信大家都会的,而 二维RMQRMQRMQ 其实与普通RMQRMQRMQ是没什么区别的。 我们可以用Maxi,j,kMax_{i,j,k}Maxi,j,k​来表示(i,j)∼(i+2k,j+...

CXR的博客 293

实战封神!YOLOv7 轻量化部署全攻略:ONNX格式转换+TensorRT极致加速(速度直接提升3-5倍,精度无损)

部署核心链路,这是YOLO系列部署的最优解,速度提升3~5倍,精度无损;ONNX是桥梁:解决模型兼容性问题,简化后能去掉冗余节点,是TensorRT加速的前提;TensorRT是核心:NVIDIA显卡的极致加速引擎,FP16量化是速度与精度的最优平衡,无需手动配置,一键开启;轻量化终极组合YOLOv7-tiny + 416尺寸 + TensorRT FP16,速度提升5~8倍,满足所有实时检测场景;避坑核心:转换参数必加,推理尺寸必须一致,engine文件显卡专属。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 308

洛谷P2216 理想的正方形(单调队列)

洛谷P2216 理想的正方形 题目链接 思路: 直接暴力显然不可行,可以发现每一个矩形向右边扩展时是一列一列增加,于是可以想到单调队列,用数组来维护当前每列的最大值。因为行也有限制,所以还要用一个单调队列来维护行的信息。 做法大概就是每次扩展一行,然后求出每一列当前的最大值,之后再一列一列来搞。 详见代码吧: #include <bits/stdc++.h> using na...

dft539533的博客 277

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

洛谷P2216 [HAOI2007]理想的正方形 || 洛谷P2219 [HAOI2007]修筑绿化带【单调队列】

Time Limit: 10 Sec Memory Limit: 162 MB Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小。 Input 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每 行相邻两数之间用一空格分隔。 100%的...

niiick 192

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

洛谷P2216 理想的正方形 单调队列

给出一个n×mn×mn×m的矩阵,现在要你从里面找出一个k×kk×kk×k的矩阵,使得这个矩阵的最大值减去最小值最大。n,m≤1e3n,m\leq1e3n,m≤1e3。 如果只是一个序列,维护长度为kkk的区间的最大值减去最小值。直接用两个单调队列分别维护这个滑动窗口即可。那么要维护一个矩形k×nk×nk×n的矩形的最大值和最小值,我们可以把每个k×1k×1k×1的矩形压缩成一个点,最大值就是其中...

qq_40859782的博客 155

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

洛谷 P2216 [HAOI2007]理想的正方形

洛谷 P2216 [HAOI2007]理想的正方形 Description 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小。 Input 第一行为3个整数,分别表示a,b,n的值 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。 Output 仅一个整数,为ab矩阵中所有“...

weixin_30614109的博客 218

单调队列【理想的正方形】

然后对每一列进行一次单调队列 mx[i][j]=b[i][j]~b[i-n][j]中最大值,mi[i][j]=c[i][j]~c[i-n][j]中的最小值。先对每一行进行一次单调队列,b[i][j]=a[i][j]~a[i][j-n]中最大值,c[i][j]=a[i][j]~a[i][j-n]中的最小值。这样进行后mx[i][j]就是以i,j为右下角长度为n*n的矩形中的最大值了,mi[i][j]同理。和男友在一起2个月啦,纪念一下。故事最后,送你一张自拍。

IDsh123456的博客 970

洛谷P2216 [HAOI2007]理想的正方形(RMQ+枚举)

这道题可以用RMQ来做。 RMQ原本是对一个数列进行预处理,这里我们只需要对矩阵的每一行都进行一次预处理就好。然后枚举可能的所有的正方形,用RMQ查询这个正方形里面的最大值和最小值,不断更新最大值与最小值之差就好。 // luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<cstrin...

shamansi99的博客 264

洛谷P2216 [HAOI2007]理想的正方形

有一个 a×b 的整数组成的矩阵,现请你从中找出一个 n×n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

HeHe_xyz的博客 371

【题解】P2216 [HAOI2007] 理想的正方形 [单调队列]

天冷防寒。

Isaac Regulus的博客 348

理想的正方形(单调队列)

题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值(2<=a,b<=1000,n<=a,n<=b,n<=100) 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。 ...

weixin_30530939的博客 325

洛谷 P2216 [HAOI2007] 理想的正方形

单调队列

sdfzrlt的博客 571

P2216 [HAOI2007] 理想的正方形

这时再对这两个数组的每一列上的值进行维护,将X[][]中每个区间的的最大值用Y[][]维护,将x[][]中的每个区间的最小值用y[][]维护。同理y[i][j]存储x[][]中第i~i+n-1行第j列的长方形的最小值。故Y[i][j]存储的实为以a[i~i+n-1][j~j+n-1]中的最大,即以i,j为左上角,边长为n的正方形中的最大值。具体实现方法:是先用单调队列对每一行的值维护,并将**a[][]每个区间的最大值,最小值分别存在X[][]和x[][]**中。我的思路是...用单调队列分别维护行与列。

xxyrcgtzbh554488的博客 528

洛谷p2216 [HAOI2007]理想的正方形

题目链接: 理想的正方形 题目分析: 这道题对于我这种菜鸡来说其实有点难……值得一做 核心思想:分别在行和列上维护单调队列 用x_min[i][j]表示以mapp[i][j]为起点向右推n个里的最小值,最大值同理 用y_min[i][j]表示以mapp[i][j]为起点向下推n个里的最小值,最大值同理 先用mapp更新x_min,x_max,再用x_min,x_max分别更新y_min,y_max...

weixin_30556959的博客 155

[BZOJ1047][HAOI2007]理想的正方形(单调队列)

题目描述传送门题解由题目可知只有每一部分的最大值和最小值是有价值的。 单调队列只能处理一维的情况,二维的不好处理。那么我们可以考虑一维一维处理,比如说,先做列再做行。 可以将每一列每一个长度为n的区间用单调队列处理出来最大值和最小值,然后缩成一个点。 然后将每一行缩成的那些点每一个长度为n的区间再用单调队列处理出来最大值和最小值,这样就相当于求出了n*n的矩形的最大值和最小值统计答案即可。代码

zyf2000 916
上一篇: 【JZOJ3188】找数【数论,数学】
下一篇: 【USACO3.1.5】【洛谷P2724】联系 Contact【模拟】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值