bzoj 1047: [HAOI2007]理想的正方形
Posted lxy8584099
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1047: [HAOI2007]理想的正方形相关的知识,希望对你有一定的参考价值。
可以叫做 二维的单调队列???
/************************************************************** Problem: 1047 User: lxy8584099 Language: C++ Result: Accepted Time:2696 ms Memory:13776 kb ****************************************************************/ /* 可以有 n^2的算法 先处理竖排的单调队列 然后往右推 往下走一格 继续往右推 用结构体搞得好模糊啊啊啊 每个数最大不超过 1e9 初始化小了 WA了好久 */ #include<cstdio> #include<cstring> using namespace std; const int N=1e3+50; struct pp { int q[N],l,r; pp() { l=1;r=0; memset(q,0,sizeof(q)); } }mx[N],mn[N]; int n,m,r,ans=0x7fffffff; int a[N][N],amx[N],amn[N],mxq[N],mxl,mxr,mnq[N],mnl,mnr; int min(int a,int b) {return a>b?b:a;} void Work() { mxl=mnl=1;mxr=mnr=0; for(int i=1;i<=m;i++) { amx[i]=a[mx[i].q[mx[i].l]][i]; amn[i]=a[mn[i].q[mn[i].l]][i]; // printf("i:%d ",i); // printf("max:%d min:%d ",amx[i],amn[i]); } for(int i=1;i<=m;i++) { while(mxl<=mxr&&mxq[mxl]<=i-r) mxl++; int mxnow=amx[i]; while(mxl<=mxr&&amx[mxq[mxr]]<=mxnow) mxr--; mxq[++mxr]=i; while(mnl<=mnr&&mnq[mnl]<=i-r) mnl++; int mnnow=amn[i]; while(mnl<=mnr&&amn[mnq[mnr]]>=mnnow) mnr--; mnq[++mnr]=i; if(i>=r) { ans=min(ans,amx[mxq[mxl]]-amn[mnq[mnl]]); // printf(" i:%d ",i); // printf(" max:%d min:%d ",amx[mxq[mxl]],amn[mnq[mnl]]); } } } int main() { scanf("%d%d%d",&n,&m,&r); // r*r MAt 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(mx[j].l<=mx[j].r&&mx[j].q[mx[j].l]<=i-r) mx[j].l++; while(mx[j].l<=mx[j].r&&a[mx[j].q[mx[j].r]][j]<=a[i][j]) mx[j].r--; mx[j].q[++mx[j].r]=i; while(mn[j].l<=mn[j].r&&mn[j].q[mn[j].l]<=i-r) mn[j].l++; while(mn[j].l<=mn[j].r&&a[mn[j].q[mn[j].r]][j]>=a[i][j]) mn[j].r--; mn[j].q[++mn[j].r]=i; } if(i>=r) Work(); } printf("%d ",ans); return 0; }
以上是关于bzoj 1047: [HAOI2007]理想的正方形的主要内容,如果未能解决你的问题,请参考以下文章