タイトルます。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 。 }