Codeforces Round #551 (Div. 2)
こどふぉは2回目でした
青色にこそなれましたが問題の元ネタを取り巻く状況が状況なだけに複雑でした
A - Serval and Bus (500点)
問題: Problem - A - Codeforces
でなくなるまでにを足すと、サーバルくんが乗ることのできるバスの時刻がわかる。つまり、の場合ににを足したあと、が一番小さいようなを出力してAC。。
拙解 (C++14): Submission #52685192 - Codeforces
B - Serval and Toy Bricks (1000点)
問題: Problem - B - Codeforces
投影図の影でないところにレーザーを放って焼くイメージで解ける。式にすると、答えの行列は
となる。ブロックが置いてあるところの高さを投影図という制約で絞るように解けてAC。。
拙解 (C++14): Submission #52689973 - Codeforces
C - Serval and Parenthesis Sequence (1500点)
問題: Problem - C - Codeforces
括弧列 (Parenthesis Sequence)と言えば '(' で+1して ')' で -1 して累積和が 0 になるかで判定できるのが有名で、これを使う。
狭義prefix(問題文参照)が括弧列として成り立ってはいけないので、累積和の最後の要素以外0になってはいけない。このためにはできるだけ正の方向に足していって0から遠ざかればいいので、自明な '?' (両端とか) 以外はすべて左側に0個以上の '(' を置いて、後の右側はすべて ')' にすればいい。これを貪欲に回試して最後に0になるかどうかを見る。これはBinary Indexed Tree (フェニック木)で累積和とればで試すことができる。これで得られた括弧列が本当に途中で0にならないかどうかをみて、大丈夫なようなら出力すればAC。。
…コンテスト本番中は証明なしに出してACになったけど今思えばこれBIT使う必要はないわ
')' だったところを '(' に変えれば総和は+2になるから変える個数でわかって全体でいけるじゃん…
拙解 (C++14, 解): Submission #52700315 - Codeforces
拙解 (C++14, 解, コンテスト終了後): Submission #52736372 - Codeforces
D - Serval and Rooted Tree (1750点)
問題: Problem - D - Codeforces
木は "without cycles"(問題文より引用)、つまりAcyclicで親←子という風なアークを考えると、これはDAGになる!つまり木DPができる。
根ノードに寄与するような最小の葉ノードの数を数えればいい。ということは、
とすると、
とすればよくなる。よって、葉は1枚ずつ、内部ノードは初期値が単位元*1になるように
としてから、上記の遷移をトポロジカルソート逆順(葉→幹)で行ってを出力すればAC。。
拙解 (C++14, コンテスト終了後): Submission #52685192 - Codeforces
E以降
見てません
まとめ
予想通りこどふぉのほうが先に青くなりましたが、こどふぉのほうがレート変動が激しいので色はコンテストごとに点滅しそうです
院試のためにも英語に慣れておくのもよさそうだしコンテストの頻度が上がると楽しいのでこどふぉも(生活リズムが崩れない程度に)やっていきたいですね
*1:こういうのモノイドっていうんでしょうか