0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ABC361 日記

Last updated at Posted at 2024-07-06

 新人競プロerの山田です。
 ABC3完、4733位、perf768、rate変動は988→963(-25)でした。死。

A問題

 配列に挿入する問題。21:03:14 AC。こういうの1分以内でACしている人はなんなんだ。状況把握だけで30秒以上かからないか普通。

B問題(一回目)

 立体問題。これのせいで冷えた。これがなければ暖まっていた。
 何からすればいいのかわからないし、全探索も不可能。ゴリ押しで重たい実装するしかないと思ってしまった。

 山田がまず実装しようとしたのは、「二つ目の図形の辺が、一つ目の図形を通っていればYes、一つも通っていなければNo」というもの。これを27分かけて実装した。
 実装中の山田の心境は、「時間かかるなー、でもB問題はどうせ正解しなきゃいけないから後に回しても意味ない。もっとずっと単純な解法があるはずなんだけど、思いつかないしどうにかして実装するしかない」だったけれど今考えるとマジで後に回すべきだった。
 
 21:29:04 提出。WA。あー今日終わったと思った。ここで初めてBを飛ばすことを決意。

C問題

 数列の要素を消していく問題。
 Bでペナった上にACできていないことを引きずりながらC問題を考える。こう焦っていると、死ぬほど短い問題文でも題意の把握に時間がかかる。問題文の誤読とバグらせを繰り返しながら約7分で実装。21:37:10 AC。普段なら5分以内でできていたかもしれない。
 Bに対して簡単すぎると思った。

B問題(二回目)

 長方形2に長方形1が内接している図形を想像した。これは共通部分を持つのに、山田のプログラムだと共通部分を持たないことになることに気が付く。それを修正した(後でわかるがこれでも間違っている)。WAになる可能性もあるのでいったんDをACしてからBを提出しようと考えた。

D問題

 ボール移動問題。
 ボールの数の制約がクソ小さいことからbit全探索→BFSという解法はすぐにわかった。
 しかし結構大変そうだった。2進数にいろいろな情報を詰め込むという重そうな実装。ボールを置ける範囲がNまでではなくN+2までというバグらせやすい構造。山田のこの時の精神状態。苦戦する未来しか見えていなかった。

 とりあえず、BFSするグラフの、頂点番号の数字(2進数)の0~N+1桁目にボールの白(0)黒(1)の情報(ボールのないところは0とした)、N+2~N+5桁目にボールのないところがどこであるか、を載せた。
 今思うと、上の段落に書いたことは手元の計算用紙にメモするべきであったけれど、この時の山田は焦りすぎてすべてを頭のなかでやっていた。

 これはACできるか……? って実装中になったのでとりあえずBを先に片付けようってなった。

B問題(三回目)

 さっき修正したプログラム(図形同士の内接を考慮したもの)を提出(21:50:45)。WA。「ええええええええええええええ」ってkokorおのなkさけんで、
 でも! 直方体2が直方体1を完全に内包しているパターンが見落とされていることにすぐ気が付きこれを追加してAC(21:54:55)。とりあえず最悪の事態は避けることができた。

 いやーーーーーーーーーーーーーーーーーーーーーボロボロ。このとき順位表見たら4000位ぐらいだったから冷えは確定だなーーーーってなげくとどうじにD問題せいかいしなきゃっておもってDにもどった。

D問題(再開)

 なんだか頭の中が混沌として、集中もできなくて、実装中にコードの全体像がまったく見えていなかった。
 たしか22:15ぐらいに実装完了した。案の定バグった。間違っている部分がBFS部分なのかグラフ実装部分なのかわからない。状況を2進数で表す系の問題でバグると、coutを使うデバッグが難しくなるから面倒。

 結局バグの原因はグラフ実装部分で
・ボールの置ける範囲を1~nとしてしまっていたこと(本当は1~n+2)(このミスは予測していたのに)
・2進数の初期化をするタイミングを間違えたこと。
 だった。

 前者はメモ用紙をまともに使っていれば防げた。後者みたいなミスは初心者のころにしかしてなかったのに今日やってしまったのは、競プロのメンタル的側面の強さを表している。

 バグは全然取れず、ACしたのは大会終了後だった。

大会終了

 焦ると全部崩れますね。Bで焦らせて、D(冷静な処理が要求される)で詰ませるという構成が意図的なものだとしたらよくできていると思います。

 重要な反省点としては

・Bで余事象(立体同士が離れている状態)を想像するという考察はすべきだった。それをしていれば正攻法にたどり着いていた。

・そもそもBで激重解法しか思いつかなかったときにすっ飛ばすべきだった。 ここで崩れると後で全部ダメになり得ることがわかっていなかった。中盤以降(B以外で3完した後など)に回すべきだった。

・Dではもっとメモ用紙を使いまくって、冷静に整理するべきだった。焦っていると頭の中でやろうとしてしまい、なおさら頭がゴチャゴチャして焦りが加速してしまう。焦っているときこそ手を使いまくって冷静に整理。

 上の反省点ほど重要ではありませんがEやFも覗くべきでした。結果論に近いですがD425、E500、F500という配点や、D問題の実装の重さ、E,Fの問題設定の単純さなどから、そうする選択肢も可能でした。そして現に大会終了後にEをパッと見たときに、こうかな? といった解法は浮かびました。実装難易度はDの半分以下なので大会終了までに提出することができたと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?