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]理想的正方形的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1047: [HAOI2007]理想的正方形

[BZOJ1047][HAOI2007]理想的正方形

bzoj 1047: [HAOI2007]理想的正方形

BZOJ 1047: [HAOI2007]理想的正方形

BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

BZOJ1047 [HAOI2007]理想的正方形