ABC086 D-Checker
https://atcoder.jp/contests/abc086/tasks/arc089_b
の色が白(黒)い場合との色が黒(白)い場合は同値です。
従って適当な白マス左下の位置がとなるについて探索を行えばよいです。
次に、探索の手法についてです。愚直にやっていたら間に合わないので高速化をする必要があります。
市松模様を動かして、希望を叶えることができる領域もまた市松模様になります。
探索する領域について希望を叶えられる部分を1,叶えられない部分を0としてプロットしたあとの、領域の最大値が答えとなります。
市松模様のプロットは二次元累積和を用いることで高速に行うことができます。
Code Formula 2014本選 F-100個の円
https://atcoder.jp/contests/code-formula-2014-final/tasks/code_formula_2014_final_f
入力無しという面白い形式の問題でした。
番目の円の半径がとなる100個の円を1500*1500の正方形の中に敷き詰めるという問題です。
まず1~50番目の円を
の領域に詰めます。
すると50個の円が残ります。
ところで、の領域は一辺が200の正方形49個に分けられます。
また、一辺が200の正方形は残された50個の円を1つずつ含むことができます。
残された50個の円を49個の正方形に置くことができれば円を詰め切ることができます。
51番目の円と52番目の円について考えます。これら2つの円を一つの正方形の中におさめられれば円を詰め切れます。
51番目と52番目の円をとを置くことができるかどうか考えてみましょう。この二つがを対角線とする正方形からはみ出ないことは明らかです。
次に、この二つが正方形内で重なっていなければ正方形内に収められていると言えます。重なっているかの判定については二つの円の中心間の距離と二つの円の半径の和を比較すればよいです。
より収められることがわかりました。
したがって51, 52番目の円はそれぞれに 置くことができます。
53~100番目までの48個について、
を満たす
に置きます。これで完成です。
余談ですが、51番目の円をに置けば49個の円をそれぞれ
に割り振るだけでもできそうです。
どちらの方が実装が軽いかについては意見が分かれるかもしれませんが。。。