C問題までは自力で解けたけど、それ以降は全然でした。
解説読んでみて分かったこと書いていこうと思います。
ちなみにC++の基本と高校数学(数Ⅲを含む)の知識を前提に書いています。
・D問題
まず、マンハッタン距離とかチェビシェフ距離とか聞いたことなかったからびっくりした。
点(x1,y1)と点(x2,y2)に対するそれぞれの定義はこんな感じ
マンハッタン距離:|x1-x2|+|y1-y2|
チェビシェフ距離:max(|x1-x2|,|y1-y2|)
問題はH×Wの長方形のマス目をマンハッタン距離がちょうどdのマス目同士が別の色になるように4色で塗りつぶすというもの。
マンハッタン距離の問題は45°回転すると見通しが良くなるという
という訳で、回転させてみようと思うけど解説と同じことしても面白くないので、より馴染み深い反時計回りで回転させようと思う。
元の点(x,y)を45°回転させると
より動いた点の新しい点の座標を(X,Y)とすると
となる。
回転後の世界で(X1,Y1)(X2,Y2)間のチェビシェフ距離を計算すると、
となり、回転後の世界を√2倍拡大するとチェビシェフ距離とマンハッタン距離が同じになることがわかる。
そこで、これ以降回転後√2倍拡大した世界
つまり、の世界を考える。
この世界をd×dのマス目で区切ると、チェビシェフ距離がdとなる点は必ず面している(接しているを含む)マスにあることがわかる。
よって、面しているマスを別の色で塗り、同じマス内の点は同じ色で塗ればよいことが分かる。
と、ここまでは理解できたんですけど、そこからどうやってコードにするかが分からん
もう、予選B始まるので諦めます。
またね(。・ω・)ノ゙