trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

AtCoder Beginner Contest 129参加メモ

Q.進捗どうですか?
A.友軍待ちです…

E5-2ラストの状態ですが。1出撃2000以上減っていくのやばい。掘りも0だしまずい…。友軍くるまで消費の少ない石垣掘り。

結果

A,B,C,DはAC。Eは後日自力AC。Fは解説見てもわけわかんない。

C - Typical Stairs

とりあえず壊れた床はないとして図を描いてみると方向性が決まりました。
f:id:trsing:20190611221036p:plain

i段目にはi-1段目とi-2段目からほいっと移動することができますのでdp[i]=dp[i-1]+dp[i-2]

壊れてる床があるとすると、
f:id:trsing:20190611221119p:plain

i-1段目は使えないのでdp[i]=dp[i-2]。壊れた床が2段続くと移動できないので0.

提出時は条件何個も書いたけど、床が壊れてるとこはdp[i]=0とするだけでいいですね。

余談

DPだ!!DPだろう!?なあDPだろうおまえ
首おいてけ
なあ!!

段数1の時を考えてなかったためREいただきました。

D - Lamp

1マスごとに上下左右捜査して照らせるマスを考えてたらO(HW(H+W))とても間に合いません。どうにか計算量減らせないかなーととりあえず図を描いたり縦横別々に考えてみると、障害物間では照らせるマスは同じだからこれを利用する方針に決めました。

f:id:trsing:20190611221216p:plain

上図のように縦横それぞれで照らせるマスのマップを作って足し合わせれば楽。障害物の位置を記録しておけば照らせるマスはO(1)で計算できるため、障害物の数とマップへの書き込み数を考えればよくてまあO(HW)でいけるなということでいけました。

余談

初4完!うれしいうれしい。うれしくて3秒くらい踊りました。座った状態で。不思議な踊りにMPを吸われたため5完はならず。踊ってさえいなければ…!

E - Sum Equals Xor

bitごとに考えます。

a,bの組は(0,0)、(0,1)、(1,0)、(1,1)の4つありますが、(1,1)なら桁上がりでa+b=a\, xor \,bの条件を満たさず死亡なので(1,1)を除いた3通りとなります。

a+b \leq Lについてですが、

  1. a+b=L
  2. a+b<L

で場合を分けて考えます。

1.の場合

Lが1なら(0,0)、(0,1)、(1,0)の3通りとなります。(0,0)を使うとa+b<Lになることに注意。
Lが0なら(0,0)のみとなります。

2.の場合

1でも0でも(0,0)、(0,1)、(1,0)の3通り使えます。

まとめると、上位桁から順に見ていって

if(L[i]=='1')
{
    dp[i + 1, 1] = dp[i, 1] * 2;    //(0,1),(1,0)
    dp[i + 1, 0] = dp[i, 1];        //(0,0)
    dp[i + 1, 0] += dp[i, 0] * 3;   //(0,0),(0,1),(1,0)
}
else
{
    dp[i + 1, 1] = dp[i, 1];        //(0,0)
    dp[i + 1, 0] = dp[i, 0] * 3;    //(0,0),(0,1),(1,0)
}

みたいな感じになります。
※dp[i,0]は2.の場合、dp[i,1]は1.の場合

余談

寝て起きたらあっさり方針が決まりました。寝てる時の私は起きてる時の私より優秀なようです。起きてる時も出て来い寝てる時の私。起きてる時の私は寝てていいよ。

1000までの値で1が出てくる数を求めよとかいう問題に似てると思った。

所感

初4完だやったぜこれ緑色すっとばして水色になるんじゃね? と思ったら茶色のままだった。現実は厳しい。

安定して4完が今後の目標。そろそろ螺旋本や蟻本に手を出したほうがよさそうな予感。