博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu 2216 理想的正方形 单调队列(其实没有DP)
阅读量:4635 次
发布时间:2019-06-09

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

#include
using namespace std;const int A=1050;const int N=105;int a,b,n;int g[A][A],q[A][N],Q[A][N];int head[A],tail[A];int Head[A],Tail[A];inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){
if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f;}int main(){ a=read(),b=read(),n=read(); for(register int i=1;i<=a;i++) for(register int j=1;j<=b;j++) g[i][j]=read(); for(register int j=1;j<=b;j++){ head[j]=tail[j]=1; Head[j]=Tail[j]=1; for(register int i=1;i<=n-1;i++){ while(head[j]<=tail[j]&&g[i][j]<=g[q[j][tail[j]]][j]) tail[j]--; q[j][++tail[j]]=i; while(Head[j]<=Tail[j]&&g[i][j]>=g[Q[j][Tail[j]]][j]) Tail[j]--; Q[j][++Tail[j]]=i; } } int ans=0x3f3f3f3f; for(register int i=n;i<=a;i++){ for(register int j=1;j<=b;j++){ while(head[j]<=tail[j]&&q[j][head[j]]
=g[Q[j][Tail[j]]][j]) Tail[j]--; Q[j][++Tail[j]]=i; } for(register int j=n;j<=b;j++){ int mi=0x3f3f3f3f,mx=-0x3f3f3f3f; for(register int k=j-n+1;k<=j;k++){ mi=min(mi,g[q[k][head[k]]][k]); mx=max(mx,g[Q[k][Head[k]]][k]); } ans=min(ans,mx-mi); } } printf("%d\n",ans);return 0;}

二维单调队列

转载于:https://www.cnblogs.com/asdic/p/9693528.html

你可能感兴趣的文章
【微信开发】上传下载多媒体文件
查看>>
java道路级别
查看>>
扩展方法
查看>>
vue事件
查看>>
Docker在Ubuntu16.04上安装
查看>>
python爬虫学习之页面登陆
查看>>
SPOJ-OPTM Optimal Marks ★★(按位建图 && 最小割)
查看>>
H264/AVC视频解码时AVC1和H264的区别
查看>>
SRAM与SDRAM的区别
查看>>
如何不使用pthread_cancel而杀死线程
查看>>
[笔记]VI编辑器的学习
查看>>
过滤器与拦截器区别
查看>>
USACO 1.5.4 Checker Challenge
查看>>
第二阶段站立会议7
查看>>
[18]Debian Linux Install GNU GCC Compiler and Development Environment
查看>>
12种排序算法
查看>>
mac 下的操作
查看>>
Safengine Android so加密
查看>>
docker学习4-docker安装mysql环境
查看>>
算法导论笔记:25所有节点对的最短路径问题
查看>>