📚

AtCoder Beginner Contest ABC434 解法メモ

に公開

文中で使用しているのは、PythonライクでAtCoderに最適な言語の1つNimです

ABC434

ABC434A - Balloon Trip

解法

W\times 1000[g]n\times B[g]未満になるときのnであるから、
答えはW*1000 div B+1となる
ACコード

ABC434B - Bird Watching

解法

種類毎に鳥の大きさを登録していけばよい
b=newSeqWith(M,newSeq[int]())
を用意して、
N羽の鳥に対して、b[Ai-1].add(Bi)していき、
最後に、0..<Mのiに対して、
b[i].sum.float/b[i].len.float
を出力すればよい
ACコード

ABC434C - Flapping Takahashi

解法

初めHにいるので、t_1までには
u=max(0,H-t1)
l=H+t1
の間にいることができる
一方で、次に進むには、l_1u_1の間にもいなくてはならないので、区間を合成した、
u=[0,H-t1,u1].max
l=min(H+t1,l1)
の間にいる必要がある
もし、それがu<lだと、区間がつぶれてしまうので、目標が達成できない、ということになる
次のt_2までには、
max(0,u-(t2-t1))
l+(t2-t1)
の間にいくことができるが、
同様に、l_2u_2との区間合成をしていけばよく、
これを繰り返していけばよい
最後まで、目標が達成できたらYesを出力することになる
ACコード

メモ

区間がつぶれた際、Noを出力して、即breakするように書いてしまったため、次のテストケースの入力と混同するWAを起こした
原因がすぐにわからず、かなり時間を溶かした

ABC434D - Clouds

解法

iが1..Nの際に、雲が一つもないマスの数の合計に、雲iしかかかっていないマスの数の合計を足した数を答えればよい
二次元の累積和をとるimos法を用いれば、雲が一つもないマスの合計zと、雲が1つしかかかっていないマスの座標を求めることができる
新たに、「雲が1つしかかかっていないマスだけ1、他は0の配列」oを考えれば、その配列のUiDiLiRiで囲まれた範囲の合計は、冒頭に言った、雲iしかかかっていないマスの数の合計に他ならない
これは改めて二次元の累積和をとれば、求めることができる
ACコード

メモ

雲番号別に、その雲しかかかっていないマスを数えることができなかった

ABC434E - Distribute Bunnies

解法

公式解説にある通り、
ジャンプ後のすべてのXi+RiXi-Riの重複を除いた座標を頂点に、
Xi+RiXi-Riを結ぶ辺をもつグラフを考え、
辺のどちらかをジャンプ先に選ぶと考える
連接成分内にループがあれば、
そこでジャンプ先を余らせることなく使い切ることができるので、すべての頂点を使うことができるが、
木構造、つまり、その連結成分に含まれる辺が、頂点数-1のときは、
葉の中の1箇所は使い切らずに余らせてしまう
まずは、ジャンプ先の座標を座標圧縮し、
さらに、各辺をUnion-Findしながらmergeしていき、
ジャンプ先のXi+RiXi-Riが同じ連結成分にいたら、頂点番号を控えておく
控えた頂点の各leaderを求め、重複を除けば、ループのある連結成分数が求まる
答えは、全頂点からgroup数を引き、ループのある連結成分数を足せばよい
ACコード

メモ

グラフを用いることすら浮かばない


反復学習にはmochiがおすすめ
全問入ったdeckはこちら

Discussion