BZOJ-1057: [ZJOI2007]棋盘制作(悬线法解极大

作者: AmadeusChan | 来源:发表于2018-11-29 11:08 被阅读0次

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1057

悬线法求极大子矩阵,最初先把到左上角的点的曼哈顿距离为奇数的数去一次异或,然后跑两次极大子矩阵就可以了。

(悬线法其实挺容易的额。。。之前作为一个傻叉一直没去学,直到现在快省选了才脑残了过来补算法额。。。)

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
#define maxn 2010
#define clear( x ) memset( x , 0 , sizeof( x ) )
#define inf 0x7fffffff 
#define down( i , x ) for ( int i = x ; i ; -- i )
 
int ans0 = 0 , ans1 = 0 , n , m , a[ maxn ][ maxn ] ;
 
int h[ maxn ][ maxn ] , l[ maxn ][ maxn ] , r[ maxn ][ maxn ] ;
 
void Solve(  ) {
    clear( h ) , clear( l ) , clear( r ) ;
    rep( i , n ) rep( j , m ) if ( ! a[ i ][ j ] ) {
        h[ i ][ j ] = h[ i - 1 ][ j ] + 1 ;
    }
    rep( i , m ) l[ 0 ][ i ] = - inf , r[ 0 ][ i ] = inf ;
    rep( i , n ) {
        int temp = 1 ;
        rep( j , m ) if ( ! a[ i ][ j ] ) {
            l[ i ][ j ] = temp ;
            if ( ! a[ i - 1 ][ j ] && i - 1 ) l[ i ][ j ] = max( l[ i ][ j ] , l[ i - 1 ][ j ] ) ;
        } else temp = j + 1 ;
    }
    rep( i , n ) {
        int temp = m ; 
        down( j , m ) if ( ! a[ i ][ j ] ) {
            r[ i ][ j ] = temp ;
            if ( ! a[ i - 1 ][ j ] && i - 1 ) r[ i ][ j ] = min( r[ i ][ j ] , r[ i - 1 ][ j ] ) ;
        } else temp = j - 1 ;
    }
    rep( i , n ) rep( j , m ) if ( ! a[ i ][ j ] ) {
        ans0 = max( ans0 , h[ i ][ j ] * ( r[ i ][ j ] - l[ i ][ j ] + 1 ) ) ;
        int rec = min( h[ i ][ j ] , r[ i ][ j ] - l[ i ][ j ] + 1 ) ;
        ans1 = max( ans1 , rec * rec ) ;
    }
}
 
int main(  ) {
    scanf( "%d%d" , &n , &m ) ;
    rep( i , n ) rep( j , m ) scanf( "%d" , &a[ i ][ j ] ) ;
    rep( i , n ) rep( j , m ) if ( ( i + j ) & 1 ) a[ i ][ j ] ^= 1 ;
    Solve(  ) ;
    rep( i , n ) rep( j , m ) a[ i ][ j ] ^= 1 ;
    Solve(  ) ;
    printf( "%d\n%d\n" , ans1 , ans0 ) ;
    return 0 ; 
}

相关文章

  • BZOJ-1057: [ZJOI2007]棋盘制作(悬线法解极大

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1057 悬...

  • 拂晓

    悬而未决 悬 悬 悬... 落日 已没地平线, 明灯 未出天际线, 悬 悬 悬 仍旧悬, 拂晓 未解依然, 苦思不...

  • BZOJ-3039: 玉蟾宫(悬线法 极大子矩阵)

    代码:http://www.lydsy.com/JudgeOnline/problem.php?id=3039 刚...

  • LeetCode之N-Queens(Kotlin)

    问题: 方法:DFS加回溯法,搜索算法是DFS暴力强解,过程中需要用回溯法重置棋盘。 具体实现: 有问题随时沟通 ...

  • 五合一跳棋

    简介 正面是跳棋的棋盘,背面是另外三种益智棋类的棋盘,走法在包装盒上有说明。进口橡胶木制作,牢固结实堪比砧板。建议...

  • 《淮南子》卷9主术训诗解16法合人心自正令行

    《淮南子》卷9主术训诗解16法合人心自正令行 题文诗: 法者度量,人主准绳.悬法者以,法不法也; 设赏者以,赏当赏...

  • 心灵悬解

    今天和孙师父聊到“佛陀不会放弃杀生的人”。我以前的理解是,修行的人,需要持戒,不能杀生。但为了利于众生,为了弘道,...

  • 将棋基本知识样《一》

    一 棋盘与棋台 棋盘(日文、发音 棋盘,由纵横各10条平行线组成,共九九八十一格。 无论直行横行斜走...

  • 红海行动·讴歌

    命悬一线舰队派, 指挥若定出红海; 一心一意解民危; 谁与争锋蛟龙帅!

  • 悬而未解

    天堂 悬而未解的秘密 此刻 又想告诉我什么 这副躯体 横陈于地 苦难又悲伤 圣人啊 你何曾需要囚徒 你需要的只是异...

网友评论

    本文标题:BZOJ-1057: [ZJOI2007]棋盘制作(悬线法解极大

    本文链接:https://www.haomeiwen.com/subject/ivmxcqtx.html