chacoderのブログ

競技プログラミングそのほか

エイシングプログラミングコンテスト2021(AtCoder Beginner Contest 202)参戦記

はじめに

2021年5月22日21:00-22:40に開催された表題のコンテストに参加しました。
結果は,64分42秒3完 5189位/8714位 パフォーマンス410でレーティングは前回902から-41の861となりました。

f:id:chacoder:20210523084705p:plain

A問題

サイコロを3回振り,出た目の反対側の目の合計を出力する問題です。
1分05秒で提出。

B問題

B - 180°

0,1,6,8,9からなる文字列を180度反転させて出力する問題です。
3分55秒 通算5分00秒で提出。
ここまでは順調でした。

C問題

C - Made Up

問題文を理解するのにちょっと手間取りました。
愚直にやるとTLEしそうなので,どう計算量を落とすか悩みましたが,少し悩んで思いつかなかったので,先にD問題以降をやろうと思い飛ばしました。

D問題

D - aab aba baa

A個の a と B個の b からなる長さ A+Bの文字列のうち、辞書順で K番目のものを求める問題です。
これもまともにやるとオーバーフローもしくはTLEしそうだったのでO(1)解法を探すべく小さめのABで少し実験しましたが法則性を思いつけず。飛ばしてE問題へ。

E問題

E - Count Descendants

最近力を入れて勉強しているグラフ問題だったのでこの問題に賭けました(賭けに負けました)。
最短パスがDiである頂点の出力はDFSで容易にできましたが,根への最短パス上にUiが存在することをO(1)で求める部分に失敗しました。

最初に考えたのは,ある頂点までに通ってきた頂点を頂点毎に配列で保持する方法ですが,これだと根への最短パス上にUiが存在することを判別するのに各頂点毎にO(N)を要し,Nもクエリ―も10^5なのでTLE必至です。

次にある頂点までに通ってきた頂点をmapのベクターで保持する方法を考えましたが,これが意外に難しくうまく実装できませんでした。うまく実装できていればO(N)・O(logN)で間に合っていたつもりです。

だいぶ苦闘しましたが結局解ききれず。

途中で順位表見るとC問題がけっこう解かれているので,せめてC問題だけでも解いておこうと思い,C問題を解きました。見返してみると配列BCだけをつかった前計算をしておけばよいことに気づきました。飛ばさずに解いていたら10~15分くらいだったでしょうか。ぎりぎりパフォ800ぐらいのラインで,いずれにしても冷えていました。

終わりに

今回も前回に続き激冷えでした
ここ2回ほどのコンテストで-83と谷に落ち込んでますが,敗因がわりとはっきりしているので明日への糧になります。

E問題は解説を見てオイラー路の考え方になるほどでしたが,オイラー路という言葉自体は見たことがあるし,使い方を知らないままライブラリも持ってたりします。蟻本にもあるのですね。

蟻本はレベルに追いつけず最初のあたりで止まってしまっていたまま手がつけられずにいましたが,そろそろじっくり履修していくタイミングかも知れません。

やるべきことがわかっているうちは,やるだけです。