AtCoder Beginner Contest 240のきろく
AtCoder Beginner Contest 240に参加で、青に復帰!!
- A - Edge Checker (100点)
- B - Count Distinct Integers (200点)
- C - Jumping Takahashi (300点)
- D - Strange Balls (400点)
- E - Ranges on Tree (500点)
- F - Sum Sum Max (500点)
- G - Teleporting Takahashi (600点、実行時間制限: 3 sec): 未提出
- Ex - Sequence of Substrings (600点、実行時間制限: 5 sec): 未提出
- 結果、感想
A - Edge Checker (100点)
隣同士の点の番号の差は か なので、それをif文で条件分岐します。
B - Count Distinct Integers (200点)
色々解法がありますが、std::set
に突っ込んで解きました。
C - Jumping Takahashi (300点)
DPです。
としたとき、初期状態で、 についてという遷移で答えを求めることができます。実際には貰うDPではなく配るDPで実装しました。また、公式解説にもあるように
std::bitset
を用いることで若干の高速化を実現することができます。
D - Strange Balls (400点)
問題文の通りのことをそのまま実装すると となりますが、C++ではそれでもギリギリ通るそうですが、私は想定解の方法で通しました。
同じ整数のボールについて 整数個数 の組で表し、これをスタックで管理することで計算量を に落とすことができます。
C++ではスタックのためのデータ構造としてstd::stack
がありますが、std::vector
やstd::deque
を使うことが殆どです。
E - Ranges on Tree (500点)
与えられた木の葉を とすると、任意の異なる2つの葉 について であるため、それに対応する集合 が互いに素でなければならず、 であることが分かります。
一方で、各葉に対応する集合を上手く構築し、その他の頂点についてはその子頂点に対応する集合の和集合にすることで を達成することができ、解のうちの1つとなります。それはDFSでの到達順に葉に1から順に番号を付け、その番号を対応する集合の唯一の要素とすることです。これで解を構築することができました。
F - Sum Sum Max (500点)
で同じ値が続く区間ごとに考えます。
とします。
または のときはその区間について単調であるか、下に凸であるため、最大値をとる可能性があるのは両端のときだけであるが、そうでないときは、上に凸であるため、途中で最大値をとる可能性があります。そのとき最大値をとるのは のときであるため、それを個別に計算すればいいです。
G - Teleporting Takahashi (600点、実行時間制限: 3 sec): 未提出
ちょっと思いつきませんでした...
Ex - Sequence of Substrings (600点、実行時間制限: 5 sec): 未提出
うむ、分からん
結果、感想
久しぶりの黄パフォで青に復帰することができました。ちゃんとこのままレートを増やしていきたいですね。