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

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

单调队列维护区间最大值最小值。。。

用 X[ i ][ j ] 表示 第 i 行 从第 j 列到第 j+n-1 列 的最大值。。。

反之,用 x[ i ][ j ] 表示最小值。。。

接下来用同种方法。。。利用 X 和 x 对每一列进行维护。。。记作 Y[ i ][ j ] y[ i ][ j ]

最后。。。枚举 i j 取最小的 Y[ i ][ j ] - y[ i ][ j ] 就是答案。。。

呆码:

#include
#include
using namespace std;int a,b,n,head1,head2,tail1,tail2,ans=999999999;int c[1010][1010],q1[1010],q2[1010];int X[1010][1010],x[1010][1010],Y[1010][1010],y[1010][1010];int main(){ scanf("%d%d%d",&a,&b,&n); for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) scanf("%d",&c[i][j]); for(int i=1;i<=a;i++) { head1=head2=tail1=tail2=q1[1]=q2[1]=1; for(int j=2;j<=b;j++) { while(head1<=tail1 && c[i][j]>=c[i][q1[tail1]]) tail1--; while(head2<=tail2 && c[i][j]<=c[i][q2[tail2]]) tail2--; q1[++tail1]=j; q2[++tail2]=j; while(j-q1[head1]>=n) head1++; while(j-q2[head2]>=n) head2++; if(j>=n) X[i][j-n+1]=c[i][q1[head1]]; if(j>=n) x[i][j-n+1]=c[i][q2[head2]]; } } for(int i=1;i<=b-n+1;i++) { head1=head2=tail1=tail2=q1[1]=q2[1]=1; for(int j=2;j<=a;j++) { while(head1<=tail1 && X[j][i]>=X[q1[tail1]][i]) tail1--; while(head2<=tail2 && x[j][i]<=x[q2[tail2]][i]) tail2--; q1[++tail1]=j; q2[++tail2]=j; while(j-q1[head1]>=n) head1++; while(j-q2[head2]>=n) head2++; if(j>=n) Y[j-n+1][i]=X[q1[head1]][i]; if(j>=n) y[j-n+1][i]=x[q2[head2]][i]; } } for(int i=1;i<=a-n+1;i++) for(int j=1;j<=b-n+1;j++) ans=min(ans,Y[i][j]-y[i][j]); printf("%d\n",ans);}
代码

 

转载于:https://www.cnblogs.com/zzzyc/p/9303193.html

你可能感兴趣的文章
[转]ASP数组全集,多维数组和一维数组
查看>>
C# winform DataGridView 常见属性
查看>>
逻辑运算和while循环.
查看>>
Nhiberate (一)
查看>>
c#后台计算2个日期之间的天数差
查看>>
安卓开发中遇到的小问题
查看>>
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>