AtCoder Beginner Contest 256 参加記録
コンテスト中AC:A〜E
C - Filling 3x3 array
となるの組が何通りあるか考えます。これは、個の区別のないボールを横1列に並べ、個のボールの間から2つ選んで区別のない仕切りを置き、仕切りの左から順にボールの個数を整数として、に割り当てる組合わせに等しいので、通りです。
これは、について、それぞれまで全探索することで、でこれらを全て列挙できます。また、全組み合わせはのケースで通りで、かなり少ないです。
の組が少ないことがわかったので、マスへの整数の割り当てについても次から示すように全探索できます。
これから示すマスの文字は以下のようなイメージです。
a b c
x y z
p q r
1行目と2行目が確定すれば3行目も確定します。そこで、以下のような解法となります。
、となる組を全探索で列挙する。
列挙したものを
とする。
の要素の全組について、以下を調べる。について、これらの組からを計算する。
を全て満たすなら答えに+1する
の全要素の全組の全探索は、で、最大でもで、問題ありません。
実は、コンテスト中はを満たすものが何通りあるかの見積もりが間違っていました。
区別の無いボール個と、区別の無い仕切り3個を横1列に並べる通り数として計算していました。です。
これは、を満たすの組であって、それぞれ0以上の場合の通り数です。
Submission #32614557 - Tokio Marine & Nichido Fire Insurance Programming Contest 2022(AtCoder Beginner Contest 256) この解法はコンテスト後に見直したものです。
E - Takahashi's Anguish
キャンディを食べる順序を有向辺と見なせそうなので、グラフの問題で考えてみます。
また、人が人より前にキャンディを食べるというのがややこしいので、以下のように言い換えてみます。
最初の不満度はである。人の後に人がキャンディを食べると不満度は減少する。不満度の最小値を求めよ。
このように考えると、人の後に人にキャンディを食べさせて得られる不満度の減少量を最大化する問題となります。 ここでは、減少量をスコアと表現します。
人を頂点とみなし、からに向かうコストの有向辺を持つ有向グラフを考えます。
これは、出次数1の有向グラフであり、このグラフに含まれる全ての連結成分は以下を満たします。
- 閉路をただ1つ持つ
- 任意の頂点から有向辺を辿る移動を繰り返すと連結成分内の閉路にたどり着き、無限ループに入る
これは一応、当ブログのAtCoderの過去問の記事で証明してみてあります。(あまり自信はないです)
リンク (ネタバレ注意)
この有向グラフの各頂点に1回ずつ訪れることを考えると、頂点を訪問順に並べた数列をとすることができます。
訪問順を考える際、を始点とする有向辺をもつ頂点を訪問した時に、
- が未訪問なら、コストを得る(スコアに加算する)。そうでない時、得られない。
とすることで、スコアの取得条件との辻褄があいます。
スコアの上界を見積もります。
各連結成分には閉路が存在します。各閉路について、閉路に属する辺の内の1つは確実にコストを得ることができません。この得ることができないコストには各閉路で最小のものを選ぶのが最適です。
以上から、閉路に属する辺のコストの内、最小のものをとし、その和をとすると、スコアの上界はとなります。
実はこれは常に達成可能です。
これを説明するために有向グラフの連結成分の1つを考えます。
にはただ1つ閉路が存在するので、これをとします。
の部分グラフであって、という感じで閉路と接続するを考えます。
は閉路を含まないため、トポロジカル順に頂点に訪問していくことで、に属する辺及び、とを繋ぐ全ての辺(言い換えればに属する頂点を始点とする全ての有向辺)のコストを得ることができます。
に接続する全ての各部分グラフについてトポロジカル順に訪問した後、のうちコスト最小の有向辺の終点から訪問を開始し、閉路を一周すれば、閉路のコスト最小の有向辺以外のコストを全て得ることができます。
減少量(スコア)の最大値はであることが分かったので、当初の問題に戻るとから減少量の最大値を引いた値が答えなので、結果として、不満度の最小値はです。
以上より、解法は、
- 各連結成分の閉路のコスト最小をとすると、が答え
ということになります。
閉路の求め方の実装ですが、強連結成分分解を利用しました。
atcoder::scc_graph
を使うと、強連結な頂点集合が二次元配列で得られるので、列の大きさが2以上であれば閉路と見なすことができます。列の大きさが2以上の各行から最小値を得れば良いです。
Submission #32566831 - Tokio Marine & Nichido Fire Insurance Programming Contest 2022(AtCoder Beginner Contest 256)