博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1047:[HAOI2007]理想的正方形——题解
阅读量:5775 次
发布时间:2019-06-18

本文共 1425 字,大约阅读时间需要 4 分钟。

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

参考:

单调队列好题,充分体现了我有多菜。

先维护每列长度为n的最大值/最小值,显然可以单调队列维护出来。

然后利用上面的数据再单调队列重新维护一遍就可以得到答案了。

#include
#include
#include
#include
#include
using namespace std;const int N=1e3+5;inline int read(){ int X=0,w=0;char ch=0; while(ch<'0'||ch>'9'){w|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9')X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}int a,b,n,g[N][N],t[N][N];int re[2][N][N],q[N][2];void solve(int k){ for(int i=1;i<=a;i++){ int l=0,r=0; for(int j=1;j<=b;j++){ while(l
=n)l++; if(!k)while(l
=q[r-1][0])r--; else while(l
<=q[r-1][0])r--; q[r][0]=t[i][j];q[r++][1]=j; g[i][j]=q[l][0]; } } for(int j=n;j<=b;j++){ int l=0,r=0; for(int i=1;i<=a;i++){ while(l
=n)l++; if(!k)while(l
=q[r-1][0])r--; else while(l
<=q[r-1][0])r--; q[r][0]=g[i][j];q[r++][1]=i; re[k][i][j]=q[l][0]; } }}int main(){ a=read(),b=read(),n=read(); for(int i=1;i<=a;i++){ for(int j=1;j<=b;j++){ t[i][j]=read(); } } solve(0);solve(1); int ans=1e9; for(int i=n;i<=a;i++){ for(int j=n;j<=b;j++){ ans=min(ans,re[0][i][j]-re[1][i][j]); } } printf("%d\n",ans); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8560547.html

你可能感兴趣的文章
context:annotation-config vs component-scan
查看>>
HTTP协议理解与应用总结
查看>>
使用Supervisor守护Python进程
查看>>
结构体和类的内存对齐原则-这一次弄清楚了对齐的本质规则
查看>>
Centos编译安装Nginx和PHP
查看>>
XDOC云服务-简单参数报表
查看>>
服务器代理(proxy)
查看>>
Linux-grep命令
查看>>
exgcd、二元一次不定方程学习笔记
查看>>
经典sql
查看>>
CSS3边框会动的信封
查看>>
JavaWeb实例设计思路(订单管理系统)
查看>>
source insight中的快捷键总结
查看>>
PC-IIS因为端口问题报错的解决方法
查看>>
JavaScript学习笔记(12)——JavaScript自定义对象
查看>>
java四种线程池简介,使用
查看>>
一般处理程序(.ashx)中session的使用方法
查看>>
EasyUI笔记(二)Layout布局
查看>>
ios View之间的切换 屏幕旋转
查看>>
js创建表格时最好要创建tbody元素
查看>>