AtCoder Beginner Contest 234 参加記

2022/1/8に開催されたAtCoder Beginner Contest 234に参加しました。

atcoder.jp

2022年最初のABCコンテストになります。今年は昨年より競プロに力を入れて、どんどん上を目指していきたいので、今回はとりあえずレート上げを達成して初回のコンテストを終えられるようにという気持ちで臨むことにしました。

今回の結果

んで、今回の結果は5完。E問題に大分時間を取られたので、タイムは大分遅めだったという印象です。

ABC234結果
ABC234結果

パフォーマンスは緑の上位。とりあえずレートを上げることはできたので、最低限の目標は達成しました。

振り返り

D問題までは順調にいってましたが、E問題でやたらと時間を取られてしまいました。

ABC234提出結果
ABC234提出結果

A問題

A - Weird Function

関数f(x)=x^{2}+2x+3を定義し、関数を再帰的に呼び出して答えを求めるという問題。

問題文のとおりに実装し、ACを取ることができました。

提出コード

https://atcoder.jp/contests/abc234/submissions/28381813

B問題

B - Longest Segment

二点間の距離の最大値を求める問題。制約上の最大はN=100であり計算するパターン数としては最大でも100 \times 99程度なので、2重ループの実装で問題なし。

こちらも問題なくACが取れましたとさ。

提出コード

https://atcoder.jp/contests/abc234/submissions/28388630

C問題

C - Happy New Year!

入力例2を参考に愚直に小さい方から数え上げてみると、2,20,22,200,202,220,222,2000,2002,2020,2022という感じで確かに2022が11番目に小さい数字となる。

で、よくよく考えるとこの数字の動き方が2進数を小さい方から数え上げたものに対して1を2に置換しただけのように見える。

確かに、11を2進数にすると1011となるので、結局答えは、入力を2進数の文字列に変換し、1を2に置換すればOK。

ということで、あとは実装だけしてACが取れましたとさ。

提出コード

https://atcoder.jp/contests/abc234/submissions/28391968

D問題

D - Prefix K-th Max

この問題は、もう少し単純に考えればよかったかと後悔しました。

先頭から愚直にK番目に大きな数値を求めようとすると、TLEになりそうなこの問題。ということで先頭からでなく、配列の一番後ろまで先読みする方法が有効ではないかと思い付いた。

  1. i = Nの場合、K番目に大きな値はN - K +1で確定。この値をKthとして定義し、解答用の配列に追加
  2. 順列Pを後ろから見ていく。P_Nを参照し、Kthより大きい場合は、現在のKthを使用済みの数値の集合Sに追加し、Kthは集合Sに含まれない値になるまで1ずつマイナスしていく。Kthが確定したら、解答用の配列に追加。
  3. 2の処理の要領で P_{N-1}から P_K まで順次処理する。
  4. 解答用の配列を、後ろから出力していく。

途中色々試行錯誤したが、出来上がった解法としてはこんなもん。結果として多少時間はかかりましたが、これでなんとかACを取ることが出来ました。

ただ、コンテスト後によくよく考えると、TreeSetを使って最小値を管理する方法の方がシンプルに実装できたかなーと反省。すこし問題を難しく捉えすぎたきらいもあります。

提出コード

https://atcoder.jp/contests/abc234/submissions/28401425

E問題

E - Arithmetic Number

等差数というのが、一般的な用語なのかよくわからんかったのでググってみるも等差数列の結果しか出てこない。。

ということで、過去問とか典型の類は当てにならないだろうということで、自力で考えてみることに。

で、よくよく考えると、 1 から 10^{17} ぐらいまでに存在する等差数なるものは多くはないと思われるので、とりあえず前計算で等差数を全部出してからソートを行い、X以上の最小の等差数を求めればよいのではと考えた。

で、どうにかして実装をしてみたものの、これが無限ループやOutOfMemoryになったりと散々な結果に。。実は等差数って結構いっぱいあるのでは??

しかも順位表から見るにこの問題、やたらとACが多く、これを落としてしまうと緑パフォすら怪しくなるという感じ。

このE問題は絶対に通しておきたいところですが、算出する等差数の桁数を限定してみたりなどしてみたものの、無限ループは治らずで、解決方法がわからずのまま、どんどん時間が過ぎていきました。。

で、よくよく確認してみると、ループ内の処理が盛大にバグっていることが判明するというオチ。。

なんやかんやで、実装からバグ治しまで40分程度かかってしまうことになりましたが、結局当初の解法でなんとかACを取ることが出来ましたとさ。

提出コード

https://atcoder.jp/contests/abc234/submissions/28412322

F問題

F - Reordering

15分程度しか残っていない状態でしたが、問題を読んでみることに。しかし、解法は全く思いつかずで、結局時間切れとなりました。

これは後日解説ACしておこうと思います。

G問題

G - Divide a Sequence

問題はチラ見してみましたが早々に諦め。

Ex問題

Ex - Enumerate Pairs

問題すらみれておりません。

これまでの実績

2022年はHighest更新という良いスタートを切れました。ここからなんとか水色を目指して頑張っていきたいです。

コンテスト実績
コンテスト実績

総括

今回は5完をキープ出来たというところでしたが、D問題はもっとシンプルに考えることはできたし、E問題は盛大にバグらせて時間を無駄にしたりなど色々と反省も多い回でした。

順位表から見ると、5完60分で水色パフォまで出たというところみたいだったので、今後はどうすれば早く正確に解けるかというのも考えていかないといけませんね。

当面は、水色コーダーになることを目標にするので、まずは過去問の青Diffまでの問題を解くことと、数を多く解いて実装力を高めるということをやっていこうと思います。

ということで、また次回も頑張ります。