zoukankan      html  css  js  c++  java
  • P2219 [HAOI2007]修筑绿化带(单调队列)

    P2219 [HAOI2007]修筑绿化带

    二维单调队列

    写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列

    来保存矩形(i+1,i+A-1)(j+1,j+B-1)内矩形C*D的最小值

    具体怎么搞呢

    先搞出二维前缀和

    蓝后先按$x$轴跑一遍单调队列,再按$y$轴跑一遍就好辣

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    inline int Max(int a,int b){return a>b?a:b;}
    #define N 1005
    int n,m,A,B,C,D,s[N][N],h[N],L,R,ans;
    int w1[N][N],w2[N][N],a1[N][N],a2[N][N];
    int main(){
        scanf("%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D);
        register int i,j;
        for(i=1;i<=n;++i)
            for(j=1;j<=m;++j){
                scanf("%d",&s[i][j]);
                s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
            }//前缀和
        for(i=A;i<=n;++i)
            for(j=B;j<=m;++j)
                w1[i][j]=s[i][j]-s[i-A][j]-s[i][j-B]+s[i-A][j-B];//A*B矩阵的和
        for(i=C+1;i<n;++i)
            for(j=D+1;j<m;++j)
                w2[i][j]=s[i][j]-s[i-C][j]-s[i][j-D]+s[i-C][j-D];//C*D矩阵的和
        for(i=C+1;i<n;++i){
            L=1,R=0;
            for(j=D+1;j<m;++j){
                while(L<=R&&h[L]<j-B+2+D) ++L;
                while(L<=R&&w2[i][h[R]]>=w2[i][j]) --R;
                h[++R]=j;
                a1[i][j]=w2[i][h[L]];
            }
        }//先处理出x轴上的最小值
        for(j=D+1;j<m;++j){
            L=1,R=0;
            for(i=C+1;i<n;++i){
                while(L<=R&&h[L]<i-A+2+C) ++L;
                while(L<=R&&a1[h[R]][j]>=a1[i][j]) --R;
                h[++R]=i;
                a2[i][j]=a1[h[L]][j];
            }
        }//再按y轴跑一遍单调队列
        for(i=A;i<=n;++i)
            for(j=B;j<=m;++j)
                ans=Max(ans,w1[i][j]-a2[i-1][j-1]);//取最小的C*D矩阵的值
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    假期小作业1
    Python_day4
    Python_day3
    Python_day2
    12/06
    12/05
    python系统学习:第三周之简单的三级菜单
    python系统学习:第二周之字典应用
    python系统学习:第二周之字符串函数练习
    python系统学习:第二周之购物车功能
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/10602605.html
Copyright © 2011-2022 走看看