草体にぼ日記

だらだらと

ARC091C Flip,Flip, and Flip......

C - Flip,Flip, and Flip......

提出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列ののときの処理とかの条件分岐、これが最適かは知りません。f:id:niboshi_bisyoujo:20191118175526p:plain

しかし、行か列が2のときは実際にマスを書いてみれば分かるのですが、答えは0になります。

で、基本的には、大きい長方形(nやmが大きい)を考えてもらうと、その外側にあるものは
操作を偶数回行うので表、
で裏になるのは ( n - 1 ) * ( m - 1)です
(内側にあるやつは9回操作されるので裏になります)


表になるものの数(つまり自身を含めて回りにあるマスが偶数個あるものを数える)
こっちは、表になるものを n * m から引こうっていう考えです
僕はこっちはやっていないのですが、解説を書いているときにこの方法のほうが楽なのかな?とかぼんやり考えてがでてきました。

おそらくどっちでも変わらないですね(分からん)