🙆

AtCoder Beginner Contest 261で爆死したので反省記事

2022/07/24に公開

概要

ABC261のA問題でWAを連発し、なんとか解けた時には実に80分近く経過していたという大爆死を記録しました。
https://atcoder.jp/contests/abc261

Bはすぐ解けたのでなんとか2問解けましたが、Cは時間が足りなくて無理でした
(終了間際に動作確認していないコードを無理やりねじ込みましたが無事TLE & WAでした)

普段は時間があってもCは解けないことが多いのですが、今回は終了後に解説を見ずにCをやり直したところ、普通に解けたのでガックリ…

あまりにも悔しいのでどうしてこうなったのか、どうすれば今後防げるかについて考えたことをまとめておきます。
(知り合いにもらったアドバイスも含みます)

内容

敗因その1: A問題だからとなめてかかり、取り組みがいい加減だった

A問題は基本的には瞬殺できるような難易度なので、今回もそうだろうと思ってろくにパターンの洗い出しも動作確認もせずにさっさと提出してしまいました。その結果が最初のWAです…

対策

Aでも侮れない問題が出ることはあると認識して、パターンの洗い出しも動作確認もちゃんとやるようにします。
Aで時間を遣うのは悔しいですが、いい加減にやってWAを出すよりはマシです。
スピードも重要ですが、いい加減にやることでスピードを出すのは普通におかしいので、速く正確に解くための訓練もそのうち必要そうですね。(現時点では優先度は低そうだが)

敗因その2: WAの原因をちゃんと考察しなかった

これもAだからなめていたというのの一環ですが、WAを見た後、一か所直してすぐに再提出ということをして再度WAを食らいました。WAが1つだけならそれでもいいですが、よく見るとWAが5つも出ていたのでこんなの再度WAに決まっています。アホでした。

対策

そもそも、WAがいくつ出たのか見ることができるということをあまり認識していませんでした。
先に書いてしまいましたが、WAが1つだけなら基本はできていてコーナーケースの考慮漏れが少しある程度と考えられますが、何個も出ていたら考慮漏れなんてレベルではなく色々おかしいとわかるはずです。
これからはWAが出たらちゃんと数を確認する習慣をつけます…
この習慣が既にあれば、WAは1つで済んでいた可能性があります。

また、WAが出たときの典型的な対処方法について先人の知恵をお借りするのが有効そうです。
https://qiita.com/H20/items/3de3f298b7c075fa5925

敗因その3: 頭の中だけで考えて図を描くなどの手段をとらなかった

WAを複数出してようやく事態の重さに気づきましたが、そこから先の立ち振る舞いにも問題があったと考えます。

今回苦労したのはA問題です。具体的には別の記事に書いたのですが、頭の中だけで考えずに図を描いていればもっと早く解けた可能性が高いです。
https://zenn.dev/dhirabayashi/articles/a69fbd69a69f9f

対策

根本的には数学力の不足があり、それもなんとかしないといけないので長期課題として考えます。
短期的には無理なので、直近では図を描いたり言葉として書き出したりなどの手段で対抗するのがよさそうです。
座標系の問題のために、方眼紙などのツールを用意しておくのもよさそうです。

敗因その4: サンプルの確認だけで満足してしまう

問題文についているサンプルは全然パターンを網羅していないとわかりつつも、サンプルのケースで想定通りの結果が出ただけでちょっと安心してしまう自分がいます。
サンプルの時点で結果がおかしければ確実にダメなので最低限の動作確認として無意味ではないですが、通れば安心というものでは全然ないので、別途ちゃんと動作確認する必要があります。

対策

といってもこれはけっこう難しいとは思うんですよね…
テストケースは自分で考えないといけないですし、複雑な問題だと入力値を自動生成しないといけない場合もあるかもしれない。それに、入力値を生成したところで出力が本当に合っているのか確認するのが難しい場合もあります。そういったことに時間をかけていては本末転倒なので、そもそも動作確認をあまりしなくてもちゃんと通るくらいの実装力をつけるしかないのでしょうか…
このあたりはバシッと結論を出せないので、引き続き考えていきます。

敗因その5: 見切りをつけなかった

別の観点として、そもそもA問題に固執する必要はなかったのではということがあります。
Aで時間をとられなければCは本番中に解けていたと考えているので、Aを捨てていれば配点がより高いCを解くことができ、成績が上がっていたといえます。
また、Aが解けないでいるうちはけっこうパニック状態に近かったので、BとCを解いて精神の安定を取り戻していればAも比較的すんなり解けて3問解けた可能性もなくはないです。

対策

そもそも、解かなくても次の問題に行けるということをあまり認識していませんでした。知らなかったわけじゃないはずなのですが、コンテスト中はそれを考えもしませんでした。
今後は考えるようにします。詰まったら先に進むとか、一定の時間が経ったら先に進むとか、決めておくとよさそうです。

敗因その6: C++の習熟度不足

なんとかAを解いてBを解いてCにたどり着いたとき、残り10分くらいしかありませんでした。
C問題はmapを使えばよさそうだとは気づいたものの、C++におけるmapの使い方で一部わからないところがあったので、時間がないにも関わらずググって調べる羽目になりました。
まあ今回に限ってはググらずに済んでも間に合わなかった可能性が高いですが、このせいで間に合わなくなったという事態が今後ないとも限りません。

対策

今のところ他の言語を使うことは想定していないため、C++の勉強をするしかありません。
まあこれは他の項目に比べると重要度は低いので、のんびりやります。

最後に

結局のところ、こういう話です。
https://twitter.com/dhirabayashi64/status/1550860852885983234

Discussion