クルトンのプログラミング教室

Pythonの使い方やPythonを使った競技プログラミングの解法などを解説しています。

Pythonで解くAtCoder(ABC176:E)

こんにちは、クルトンです!
この記事では

AtCoderの「AtCoder Beginner Contest 176」のE問題をPythonを使って解説します。

問題のリンクを載せておきます。

atcoder.jp


解法

解説が分かりやすかったので、解説を参考にしてください。


解説

atcoder.jp


解説の補足

解説の「爆発対象が存在するマスは高々M個しか存在しないため、調べる回数はM回以下に抑えることができ、全探索することが可能です。」という部分について少し詳しく説明します。

kort0nさんのコードでは「R_Aが最大かつC_Bが最大となる(A, B)」について全探索して、爆発対象が存在しない(A, B)の組み合わせが存在するかについて調べています。

このとき、「R_Aが最大かつC_Bが最大となる(A, B)」についてすべて調べると、計算量は

O(HW) \leq O(9 \times 10^{10})

となり間に合いません。

しかし、爆発対象はM個しかないためM+1個まで調べると、爆発対象が存在しない(A, B)の組み合わせが必ず見つかります

よって爆発対象が存在しない(A, B)の組み合わせを見つけた時点で探索を打ち切ると、計算量は

O(M) \leq O(3 \times 10^5)

となり、十分間に合います。


本解のサンプルコード

Pythonで書いた解答を載せておきます。

atcoder.jp


別解

実は上のように全探索をしなくても解くことができます。

まず、R_Aが最大かつC_Bが最大となる(A, B)の集合をPとおきます。


ここで「Pの任意の要素(A, B)に対して、爆発対象が存在する」という条件について考えてみましょう。

この条件は「Pの要素数と爆発対象の内Pに含まれる要素の数が等しい」と言い換えることができます。


Pの要素数は、R_Aが最大となるAの数とC_Bが最大となるBの数の積に等しく、

爆発対象の内Pに含まれる要素の数は、爆発対象(A, B)のうちR_AC_Bが共に最大となる(A, B)の数に等しいので、

これらが等しければ「Pの任意の要素(A, B)に対して、爆発対象が存在する」ことになります。


このときの計算量は、爆発対象を全探索しているためO(M)となります。

別解のサンプルコード

Pythonで書いた解答を載せておきます。

atcoder.jp


まとめ

今回は

  • 計算量に注意しながら全探索する

という問題でした。

ではまたお会いしましょう!さようなら~