zoukankan      html  css  js  c++  java
  • [bzoj1057][ZJOI2007]棋盘制作

    题意:给定一个n*m的矩阵,每个点都是黑色的或者白色的,现在要从矩阵上割出一个小棋盘(黑白相间,任意两个相邻点颜色不同),求最大的矩形棋盘和正方形棋盘。

    这道题想了好久.....发现只会n^3/20,或者n^2logn求正方形......哎我好菜啊

    正解:首先很容易想到将横纵坐标和是偶数(或者奇数,看心情)的所有点^1,这样问题转变为求最大的全是0/1的矩阵

    用s[i][j]表示第i行第j列的点最大向右(随意哪个方向,看心情)多少个都是0(或者1,看心情),这个很好n^2处理。

    然后我们枚举一条边所在的列j(或者行,看心情),然后枚举行i,确定一个点之后往外暴力扩展,就可以在n^3的时间内T掉该题。

    但是我们可以发现最大的矩形它的宽(或者长,看心情)显然是受到了某个奇异力量的制约,所以会等于某个s[i][j](这个很好理解)

    于是我们用一个单调栈,维护s单调上升。插入一个点时,如果它比栈顶的s小,那么栈顶的那个s就可以结束它的使命啦,后面的所有点向外扩展显然都不会以它为宽。在一番紧张刺激的计算之后,我们就可以请他离开咯。

    复杂度n^2

    #include<iostream>
    #include<cstdio>
    #define MAXN 2000
    using namespace std;
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    
    int n,m,ans1=0,ans2=0;
    bool b[2005][2005];
    int s[2005][2005];
    int q[2005],qx[2005],top=0;
    inline int sqr(int x){return x*x;}
    
    void push(int x,int num)
    {
        for(int i=num;top&&qx[top]>x;num=q[top--])
        {
            ans1=max(ans1,(i-q[top])*qx[top]);
            ans2=max(ans2,sqr(min(i-q[top],qx[top])));
        }
        q[++top]=num;qx[top]=x;
    }
    
    void solve()
    {
        for(int i=1;i<=n;i++)
            for(int j=m;j;j--)
                s[i][j]=b[i][j]?s[i][j+1]+1:0;
        for(int j=1;j<=m;j++,push(0,n+1),top=0)
            for(int i=1;i<=n;i++)
                push(s[i][j],i);
    }
    
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)
        {b[i][j]=read();if((i+j)&1)b[i][j]^=1;}
        solve();
        for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)b[i][j]^=1;
        solve();
        printf("%d
    %d",ans2,ans1);
        return 0;
    }
  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/FallDream/p/bzoj1057.html
Copyright © 2011-2022 走看看