AtCoder Beginner Contest 278 参加記

2022/11/19に開催されたAtCoder Beginner Contest 278に参加しました。

atcoder.jp

先週のABCは、D問題でバグらせたり、E問題で時間がなかったりと散々な内容で爆死しました。今回はその負け分をすこしでも取り戻そうという気持ちで臨みました。

今回の結果

なんとか5完を確保!しかし、順位表からみると少しイマイチという感じの結果でした。。

ABC278結果
ABC278結果

なんと5完でもパフォーマンスは緑色。。レートは微増しましたがパッとしない結果でした。

なんとも昨今の参加者のレベルの上がり方がすごいなあという感想しかありません。

振り返り

時間があれば6完行けるかという感じでしたが、及ばず。

ABC278提出結果
ABC278提出結果

A問題

A - Shift

A問題にしては、だいぶややこしい問題を持ってきたなあという印象。

実装方法は色々考えられるが、とりあえず、配列Aを先頭から最大K個分を読み飛ばしてから同サイズ配列に入れ直すというやり方で提出。

少し実装に時間をかけてしまいましたが、無事ACが取れました。

5分12秒で1完。

提出コード

https://atcoder.jp/contests/abc278/submissions/36602946

B問題

B - Misjudge the Time

問題の意図を把握するのに少し時間がかかったものの、やることは時刻を1分ずつ進めて、それが見間違えやすい時刻になるかというのを全探索すれば良いだけ。

こちらも、提出1回で問題なくACが取れました。

13分52秒で2完。

提出コード

https://atcoder.jp/contests/abc278/submissions/36609023

C問題

C - FF

グラフ問題にするのかと思ったが、制約を見てみると、N \leq 10^{9}なので、Mapで管理するような感じになるのかという印象。

//キー:ユーザーID、値:フォローしているユーザーIDの集合
HashMap<Integer, HashSet<Integer>>

上記のマップオブジェクトでフォロワーを管理。クエリ1, 2の時に更新を行い、クエリ3の時に相互フォローしているかチェックする。

この実装でなんとかACを取り切ることができました。

24分38秒で3完。

提出コード

https://atcoder.jp/contests/abc278/submissions/36615660

D問題

D - All Assign Point Add

当初クエリ1は、Aの全要素にxを足すものと誤読したので、余計な時間を取られてしまいました。。

で、配列のすべての要素に代入するということで、遅延セグ木を使うような問題かと一瞬思いましたが、それは流石にオーバーかと。

ということで、とりあえず以下の解法で実装してみることに。

  • クエリ1が現れた回数と、直近のクエリ1で与えられたxを覚えておく。

  • 長さNの配列Bを用意し、A_{i}はクエリ1の何回目の値に基づくのかを管理する。

  • クエリ2,3では A_{i}を参照する時に、 B_{i}をチェックし、クエリ1の出現回数と合う場合はそのまま計算。合わない場合は、直近のクエリ1の値を元に計算しなおす。

これで、1度の提出で問題なくACを取ることができました。

42分59秒で4完。今回は、なんとか5完はいけそうな感じです。

提出コード

https://atcoder.jp/contests/abc278/submissions/36624382

E問題

E - Grid Filling

残り60分弱というところでも、EのAC数は1000に届こうかという勢いで解かれており、この問題をACしておかないと爆死する予感。

少し手強い問題だったが、以下のDPを使えばなんとかいけそうな感じがした。

  • \ dp \lbrack i\rbrack \lbrack j\rbrack \lbrack k\rbrack:=左上から、マス (i, j)の範囲にあるkの個数。

これを使えば任意の範囲で、色kが何個あるかがO(1)で分かる。あとは、塗りつぶす範囲にある各色の数と、グリッド全体にある各色の数を比較し、一致したら、種類数から減らしていくようにすれば良い。

ということで、実装に着手。結局実装とデバッグに時間が掛かったものの、なんとかACを取り切ることができました。

88分50秒で5完。が、、順位表を見ると、この時点では1700台ぐらい。。多分水パフォは厳しいな。

提出コード

https://atcoder.jp/contests/abc278/submissions/36639798

F問題

F - Shiritori

残り10分しかないが、とりあえず問題文を見る。

一見したところ、しりとりの繋がりで有向グラフを作り、各頂点をスタート地点としてから、DFSをすることで、先手後手どっちが勝つかを判定すればなんとかなるかという印象。

が、、残り10分程度しかない状態では、実装までは追いつかずでした。。ということで今回はここで時間切れ終了。

一応、ノーヒントで後で解き直すことはできたのですが、時間的には30分は必要だったようです。もう少し実装力をつけないとなあ。。

G問題

G - Generalized Subtraction Game

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

Ex問題

Ex - make 1

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

これまでの実績

レートは微増しましたが、今回の調子だと、今後緑をキープするのすら危うい感じがしますなあ。。

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

総括

今回、問題セットとしては、6完まで行けたかというところでしたが、D問題の誤読や、実装に時間をかけすぎなどの問題があったりで、大したパフォーマンスが出せませんでした。

あと、最近のABC参加者の全体のレベルが大分上がってきている気がしますね。数ヶ月前だと、今回の内容は水パフォぐらい取れる感じがしますが、5完でやっとこさ緑パフォというのはキツすぎる。

とりあえず、今後も精進を重ねて実力を上げていかないと緑レート維持すら怪しいという感じ。周りに取り残されないように今後も努力していこうと思います。

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