直接行うことができます左上隅として各点の列挙が、書くことがより困難
単純なアプローチは、列または行の統計的寄与が存在しています
Bが存在し、このようなライン部Lこと、Rは、次の3つの場合があります
1.行がW、答えは1になっているこの時点でこのラインの寄与であるそのような間隔がありません
2.R-L + 1 <= kの場合、このセクションは、代表点をカバーする矩形が長方形であるような点部の存在下で測定することができ、見つけなければならない場合にのみ、場合長方形内の点、この行は貢献していきます1
3.R-L + 1> kで、貢献することはありません
ケース2の場合、我々は最後の私たちは、長方形の代わりにこの点を確認するために選択し、各点を列挙、統計を見て2次元差分を使用した場合のライン上の最大の貢献
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define N 2005 チャーMP [N] [N]。 INTのN、K、TOT、L [N]、R [N]、U [N]、D [N]、CNT [N] [N]。 INT メイン(){ CIN >> N >> K。 以下のために(int型 i = 1 ; iが<= N; I ++ ) のための(INT J = 1 ; J <= N; J ++ ) のscanf(" \ n%C "、&MP [I] [J])。 memsetの(L、0x3fを、はsizeofのL)。 memsetの(U、0x3fを、sizeof U); 用(int型 i = 1 ; iが<= N iが++ ){ ため(INT J = 1 ; J <= N; J ++ ) 場合(MP [I] [J] == ' B ' ) L [I] =分(L [i]は、j)は、R [I] = MAX(R [i]は、J); もし(L [I] == 0x3f3f3f3f ) TOT ++ 。 他の 場合(R [I] -1- [I] + 1 <= K){ int型の X1 = MAX(1、I-K + 1)、Y1 = MAX(1、R [I] -k + 1 )。 INTの X2 = I、Y 2 = L [i]は、 CNT [X1] [Y1] ++; CNT [X1] [Y2 + 1 ] - 。 CNT [X2 + 1 ] [Y1] - ; CNT [X2 + 1 ] [Y2 + 1 ] ++ ; } } のための(INT J = 1 ; J <= nであり、j ++ ){ ため(int型 i = 1 ; iが<= N; iが++ ) 場合(MP [I] [J] == ' B ' ) U [J] =分(U [j]は、i)は、D [j] =MAX(D [j]は、I); もし(U [J] == 0x3f3f3f3f ) TOT ++ 。 他の 場合(D [j] -u [J] + 1 <= K){ int型の X1 = MAX(1、D [j]は-k + 1)、Y1 = MAX(1、J-K + 1 )。 int型 ×2 = U [J]、Y2 = J; CNT [X1] [Y1] ++; CNT [X1] [Y2 + 1 ] - 。 CNT [X2 + 1 ] [Y1] - ; CNT [X2 + 1 ] [Y2 + 1 ] ++ ; } } int型年= 0 ; 以下のために(int型 I = 1 ; I ++; iが= N < ) のための(INT J = 1 ; J <= nであり、j ++ ){ CNT [I] [J] + = CNT [I- 1 ] [J] +のCNT [しますI] [J- 1 ] -cnt [I- 1 ] [J- 1 ]。 年 = MAX(年CNT [i]は[J]); } Coutの << +年前<< てendl; }