BZOJ 1047

来源:互联网 发布:在线音乐识别软件 编辑:程序博客网 时间:2024/05/17 22:30

二维单调队列

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define maxn 1010using namespace std;int n,m,r,mx[maxn][maxn],mn[maxn][maxn],ma[maxn][maxn];struct queue{int ql,qr,q[maxn][2],lim,f;queue(){ql=qr=0;}queue(int f):f(f){ql=qr=0;}void push(int pos,int cnt){//printf("<%d,%d>",q[q])while(ql<qr&&(f?q[qr-1][0]<=cnt:q[qr-1][0]>=cnt))qr--;//printf("[%d,%d]\n",ql,qr);q[qr][0]=cnt;q[qr++][1]=pos;}int pop(){while(ql<qr&&q[qr-1][1]-q[ql][1]+1>lim)ql++;return q[ql][0];}int size(){return q[qr-1][1]-q[ql][1]+1;}void clear(){ ql=qr=0; }}mxq(1),mnq(0);int main(){scanf("%d%d%d",&n,&m,&r);for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)scanf("%d",&ma[i][j]);mxq.lim=mnq.lim=r;for(int i=1;i<=n;++i){mxq.clear();mnq.clear();for(int j=1;j<=m;++j){mxq.push(j,ma[i][j]);mnq.push(j,ma[i][j]);mx[i][j]=mxq.pop();mn[i][j]=mnq.pop();//printf("%d ",mx[i][j]);}//putchar(10);}int ans=1<<30;for(int j=r;j<=m;++j){mxq.clear();mnq.clear();for(int i=1;i<=n;++i){mxq.push(i,mx[i][j]);mnq.push(i,mn[i][j]);if(i>=r)ans=min(ans,mxq.pop()-mnq.pop());}}printf("%d",ans);}


0 0
原创粉丝点击