E.放火でバーランドの森(2次元マトリクス配列を見つけるために考え、二点)

タイトルます。https://codeforces.com/contest/1262/problem/E

分析:次に、マトリックスアレイの前処理、及びバイナリ回答薪対象プロセスを復元し、要件を満たすか否かを判断します

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define PB一back 
typedefの長い 長いLL。
const  int型 M = 1E6 + 5 int型のmain(){
     int型のn、mは、
    イオス:: sync_with_stdio()、cin.tie(0)、cout.tie(0 ); 
    CIN >> N >> M。
    ベクター < ストリング > (N)
    ベクター <ベクトル< INT >> B(N、ベクトル< INT > (M))。

    以下のためのint型iは= 0、I <N; I ++ 
        CIN >> [I]。
    /// 找出矩阵
    ためINT iは= 0、I <N; I ++ のためのINT J = 0 ; J <M、J ++ 場合([I] [J] == ' ')B [I ] [J] = 0 ;
            そうであれば(私は== 0 || J == 0)B [i]は[J] = 1 他の B [i]は[J] =分(B [I- 1 ] [J- 1 ]、分(B [I- 1 ] [J]、B [i]は[J- 1 ]))+ 1 INTは L = 0、R = 1E6。
    ベクター <ベクトル< INT >> C(nは、ベクトル< INT > (M))。
    一方、(RL> 1 
    { 
        int型ミッド=(L + R)>> 1 int型のx = 2 *ミッド+ 1 ;
        ブールフラグ= 以下のためにINT iが= 0 ; I <N I ++ のためのINT J = 0; J <M、J ++ 場合(B [I] [J]> = X)C [i]は[J] = X。
                他の C [i]の[J] = 0 ;
        /// 还原矩阵
        ためINT I = N- 1、I> = 0 ; i-- のためのINT J = M- 1 ; J> = 0 ; j-- 
            { 
                場合(I> 0)C [ I- 1 ] [J] = MAX(C [I- 1 ] [J]、C [I] [J] - 1 )。
                もし(J> 0)C [I] [J- 1 ] = MAX(C [I] [J =1 ]、C [I] [J] - 1 )。
                もし(I> 0 && J> 0)C [I- 1 ] [J- 1 ] = MAX(C [I- 1 ] [J- 1 ]、C [I] [J] - 1 )。
            } 
        /// 与原图进行判断
        
        するためにINTは私= 0 ; I <N; I ++ のためのINT J = 0 ; J <M J ++ 
            { 
                場合(B [I] [J] == 0継続を;
                もし(C [i]の[J] == 0)フラグ= 
            } 
        であれば(フラグ)L = ミッド。
        他の R = ミッド; 
    } 
    COUT << L << ENDL。
    INT X = 2 * L + 1 
    ベクター < ストリング > ANS(N、(M、' ' ));
    以下のためにINT iは= 0 ; I <N I ++ のためのINT J = 0 ; J <M、jは++ ){
         場合(B [I] [J]> = X){
            ANS [I -l] [JL] = ' X ' 
        } 
    } 
    のためにINT iは= 0 ; iは<N; I ++ ){ 
        COUT << ANS [I] << ' \ n ' 
    } 

    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/starve/p/11983906.html