イバコの生存記録

いまは競プロ(AtCoder)記事がメインです。

131. AtCoder参加記録(AtCoder Beginner Contest 265)

34回参加でレート 1410 です。

 

 

今回はパフォーマンス 1680 です。

ABCDEを通して、FGExは未解答です。Cで1ペナ、Dで1ペナ。

 

各問題の思考過程など。

A

問題

2分7秒。

パッと思いつかなかったので全探索しました…

ACコード

 

B

問題

4分38秒。

書かれている通りにやるだけ。持ち時間の消費タイミング、移動可能判定のタイミングなどに注意しつつ書けばOK。

ACコード

 

C

問題 

初回提出6分10秒、そこからACまで1分16秒。

あるマスにいるとき取れる行動は1つだけなので、以前訪れたマスに再訪した場合は無限ループになります。よって、状態は  O(HW) しか無いので普通にシミュレーションすれば間に合います。

if に else を付けるのをサボってバグらせてしまい、悲しい1ペナ。かなり痛い…。

ACコード

 

D

問題

初回提出8分37秒、そこからACまで8分11秒。

  1. ちょっとややこしいので入力例1を書いてみる。区間和が  P + Q + R になるような場所を見つけるのが必要なのか。
  2. 区間和なので累積和がすぐ想起される。
  3.  x が決まれば、 y x から  y-1区間和が  P になるところ、 z x から  z-1区間和が  P+Q になるところ、 w x から  w - 1区間和が  P+Q+R になるところを求めればよい。一見ややこしいが、要するに「累積和に対して二分探索」を3回並列でやるだけ。これで  O(N \log N) なのでOK。
  4. 添字バグで1ペナ。やたら時間を取られつつ修正…。

なんでこんなに時間掛かったんだろう…という感じでした。添字バグは普通に実力不足。

ACコード

 

E

問題 

37分11秒。正しい方針に辿り着くまでかなり時間を要しましたが、そこからは早かったです。

  1. 愚直解は  O(3^N) なので当然無理。
  2. 全通りから障害物を通るルートだけ引く?と考える。操作1~3をそれぞれ何回行うのか、を全探索すれば  O(N^3) になるので、計算量的にこの操作が想定解に含まれてる気がする。
  3. 各操作回数が決まった状態で辿り着く座標は、操作順序に依存しない。ある操作回数で障害物に辿り着いた場合、そこまでの通り数は次のステップに加算しないような処理になれば嬉しい… → ここからDPに発想が行き始める
  4. 少しずつ操作回数を増やすようなDPなので、(全操作回数, 操作1の回数, 操作2の回数, 操作3の回数)という状態が必要そう…。これは流石に実行時間制限3秒でも無理では?
  5. 操作3の回数は、全操作回数から他の操作回数の和を引けばよかった。じゃあこれでいいか。
  6. ある座標に障害物が存在するかは、座標値を上手く64ビット整数に押し込むことで HashSet によって  O(1) で判定できる。
  7.  dp[i,j,k] = (全i回操作し、操作1をj回、操作2をk回行うときの障害物を経由しない通り数)
    という定義になる。

ACコード

 

F

問題

解けず。

Eまでに時間を掛けすぎた感覚はあったので、ひとまず順位表を見ると全然通されてない…。ということは、だいぶ難しい問題なのだなと覚悟しました。

チェビシェフ距離に変換して…みたいなことを考えていましたが、 N 次元なので無理では、となり断念。何の方針も立たなかったので10分くらいで諦めました。

 

G

問題

Fよりはこちらの方が取っつきやすさはありました…が、遅延評価セグメント木を使ってもちょっと無理そうな操作だったので、他に打つ手が無く諦めました。

 

Ex

見てないです。

 

 

今日もペナが勿体ない日でした…。これだけでパフォーマンス100以上は落としています。Eがもう少し早く解けてればなぁ、という気持ちですが、実力相応という感じが強いです。

とりあえず水色の折り返し地点であるレート1400に乗りました。アルゴリズムは未だに最高パフォーマンスが1701(この前初参加したヒューリスティック(1744)の方が高い)なので、ここから先は厳しい戦いになりそうな予感がします。

Gを当てられるようになったら最高レート自体は青に届くと思いますが、たぶん維持が難しいので、ひとまずEまでを素早く正確に解くこと・Fを30%くらい通せるようになることを当面の目標としたいです(精選上級編がつらかったのもあります)。

青diff問題をひたすら解くような感じで頑張っていこうと思います。