Senの競技プログラミング備忘録

こけた問題を自分用の解説で載せる。けんちょんさんのブログを目指したい。質的にも量的にも。こけた問題だけに限定するけど

Good Bye 2015 - C. New Year and Domino

codeforces.com

概要

H*Wのグリッドを与える。そのグリッドには"."と"#"の2つがある。あなたは1*2のサイズのドミノを持っていて、縦向きか横向きのいずれかの向きで、グリッドの2つ連続で"."になってる場所における。
次のq個のこqueryに答えよ。

  • グリッドを1-idxとして、[a, b] * [c, d]の範囲のグリッドに、ドミノは何通りの起き方が存在するか?

制約: 1 <= a <= c <= h <= 500, 1 <= b <= d <= 500

ACするまで

1. query大量にあるから、O(1)で答えられるようにしたいなぁ。
2. 2次元累積和をやるとうまくいきそう。
3. しかし、縦向きと横向きの両方があるので、単純に厳しい。この2種類をごちゃまぜにして実装すると、実装がすごいことになる。



4. このタイプの問題は、縦向きと横向きの2種類の置き方があるので、別々に、縦向きにいくつ置けるかと横向きにいくつ置けるか、分けて考える。
5. それぞれ分けると、2次元累積和が簡単に書ける->AC!

考察


Point
2次元や3次元でまとめづらい状態があるのならば、それぞれの軸ごとに考えてうまくいくか?を考えてみる。

今回の場合、この場合ドンピシャであるので、そのまま実装する。

ちなみに、2次元累積和の実装においては、丁寧に図を書いて、indexに注意したほうがいい。今回の場合、ドミノミノが2マス以上にわたるので、いつもと違って少し変則である。

ACソースコード
Submission #71382222 - Codeforces

一言

これは要反省。要反省。要反省。