mini notes

競技プログラミングの解法メモを残していきます。

AGC043 B - 123 Triangle

問題:B - 123 Triangle

解答:Submission #11073495 - AtCoder Grand Contest 043

解法:a[i]を-1して各要素を0, 1, 2で考える。各ステップに現れる数字も0, 1, 2のいずれかであり、最終的な数字も0, 1, 2のいずれかである。

ここで、次のような場合分けが重要である。

  1. a[i]に1が含まれている
  2. a[i]に1が含まれていない

1.の場合は、最終的な数字は2になりえない。2.の場合は、最終的な数字は1になりえない。よって下記のような操作を考えればよい。

  1. 2を0にして考え、各項をmod2で足し続ける
  2. 2を1にして考え、各項をmod2で足し続け、足し続けた結果を2倍する

足し続けた結果は実験により、二項係数を用いてn-1C0 * a[0] + n-1C1 * a[1] + ... + n-1Cn-1a[n-1] のmod2となる。nCkの偶奇は(n & k == k)なら奇数、それ以外は偶数である。よってこの問題が解けた。

Donutsプロコンチャレンジ2015 C - 行列のできるドーナツ屋

問題:C - 行列のできるドーナツ屋

解答:Submission #11037583 - Donutsプロコンチャレンジ2015

解法:スタックを準備し、数列を前から見てゆく。人iについて出力するのはその人より前でできている狭義単調減少列の長さであり、その単調列をスタックに格納しておく。

人iの出力はその時点でのスタックのサイズである。その後スタックを更新する。これはスタックに含まれる要素が人iの身長h[i]より小さいときにスタックからPopし続けたあと、h[i]をスタックに格納する。(人iよりより前にいる人iより小さい人は、人iの後ろの人から見えなくなるため)

CODE FESTIVAL 2014 Easy C - 身体バランス

問題:C - 身体バランス

解答:Submission #11036772 - CODE FESTIVAL 2014 Easy

解法:sからとtからでそれぞれダイクストラし、d1[u] == d2[u]かつd1[u] < INFであるものがあれば、uを出力する。

Donutsプロコンチャレンジ2015 B - Tokyo 7th シスターズ

問題:B - Tokyo 7th シスターズ

解答:https://atcoder.jp/contests/donuts-2015/submissions/11032269

解法:bit全探索で全てのユニットの組み合わせを試せばよい。計算量は216 * 50 * 9 = 29491200で何とか間に合う。

CODE FESTIVAL 2014 予選B C - 錬金術士

問題:C - 錬金術士

解答:Submission #11032114 - CODE FESTIVAL 2014 予選B

解法:まず、各文字種('A' - 'Z')について、S1内の個数とS2内の個数の和がS3内の個数より小さいものがあれば、NOを出力。全ての場合でそうでないなら、「S1から何個、S2から何個」という個数を気にしなければS1とS2からS3を作れることになる。

次に、S1とS2からそれぞれちょうどN/2個ずつ文字を取り出すという条件を考える。例えば文字AがS1に2個、S2に4個、S3に5個ある場合に、S1とS2から最低何個ずつ取り出す必要があるかを考える。これは対になる文字から最大限の取り出しがあった場合を考えると、文字S1からは5-4=1で最低1個、S2からは5-2=3で最低3個のAを取り出す必要があることになる。よって、S1とS2についてこの最低限取り出す必要のある文字数をチェックし、その数がどちらかでもN/2を超えていれば、NOを出力する。そうでないなら、必ずS3を生成できる。これを次で示す。

S1から最低限取り出す文字数をm1、S2のそれをm2とする。このときm1 + m2 < N / 2 + N / 2 = Nであるが、残りのN - m1 - m2個の文字はS1からもS2からも取り出すことができる文字である。よってそのうちN / 2 - m1個をS1から取り出し、N / 2 - m2個をS2から取り出せばよい。

天下一プログラマーコンテスト2013予選B B - 天下一後入れ先出しデータ構造

問題:B - 天下一後入れ先出しデータ構造

解答:Submission #10994449 - 天下一プログラマーコンテスト2013予選B

解法:Stackされる数とその個数をそれぞれ管理するスタック(snum, scnt)を準備し、Push・Pop命令は1つのクエリをまとめて処理する。