提出AC
Submission #8512938 - AtCoder Regular Contest 091
int main() { cout <<setprecision(10); ll n , m ; cin >> n >> m ; ll ans = max((ll)0, (n-2)*(m-2)); if(n==1||m==1){ if(n*m == 1){ ans = 1; }else if( n * m == 2){ ans = 0; }else ans = n*m -2 ; } cout << ans << endl; }
解法
自身を含めて回りにあるマスが奇数個なら裏になる
偶数個なら表になる
①
裏になるものの数(つまり自身を含めて回りにあるマスが奇数個を数える)
上のコードはこちらでやりました(最適解とは言ってない)
1行もしくは1列ののときの処理とかの条件分岐、これが最適かは知りません。
しかし、行か列が2のときは実際にマスを書いてみれば分かるのですが、答えは0になります。
で、基本的には、大きい長方形(nやmが大きい)を考えてもらうと、その外側にあるものは
操作を偶数回行うので表、
で裏になるのは ( n - 1 ) * ( m - 1)です
(内側にあるやつは9回操作されるので裏になります)
②
表になるものの数(つまり自身を含めて回りにあるマスが偶数個あるものを数える)
こっちは、表になるものを n * m から引こうっていう考えです
僕はこっちはやっていないのですが、解説を書いているときにこの方法のほうが楽なのかな?とかぼんやり考えてがでてきました。
おそらくどっちでも変わらないですね(分からん)