gyouzasushi’s diary

競プロとか

AtCoder Beginner Contest 157に参加しました。

成績

5完4ペナで282位でした。

f:id:gyouzasushi:20200302014854p:plain

微増。

f:id:gyouzasushi:20200302015053p:plain

A - Duplex Printing

\lceil \frac{N}{2} \rceil

提出

B - Bingo

言われた通りにやります。こういうのはループを回すより全パターン手で打った方が早そうなので、縦横斜め8ラインを気合いでチェックします。

f:id:gyouzasushi:20200302092438p:plain

添字ミスで1WA。いやサンプル合うなや。

提出

C - Guess The Number

BでいきなりWAを出してしまい、不穏です。

とりあえず、空いてる桁をなんとなく0で埋めていったらなんとなくサンプルが通ったので、なんとなく提出。案の定WA…。

落ち着いて考え直すと、1 \leq N \leq 3 なので、N桁の整数を小さい方から全て調べることができます。N桁の整数を小さい方から全て調べて、AC。

前半のくだりほんまにいらんかった。

提出

D - Friend Suggestions

わからんわからんわからん。情報量が多すぎる。Eを見に行きます。

E - Simple String Queries

なんとなくいけそうなので、Dの前にこちらを考えることにします。

一点更新クエリ(type1)と区間についてのクエリ(type2)といえば、セグメント木です。26文字のアルファベットがある区間に含まれるか否かは、bitを用いて管理できそうです。解けました!!!(具体的には、区間orを計算できるセグメント木を用意して、'a' -> 2^0, ... , 'z' -> 2^{25}として初期化します。そうすると、ある区間のorのpopcountがその区間に含まれる文字の種類数になります。)

0-indexedに直し忘れている箇所があり、1WA。そんな〜。

提出

D - Friend Suggestions

結局求めたいものは 、各人の「友達の友達の…友達たち」のうち、「ブロック関係にある人」「直接の友達」「自分自身」を除いた人数だとわかります。これはUnion-Findを使うと高速に求められます。

配列の大きさが足りなくて1WA。そんな〜。

提出

F - Yakiniku Optimization Problem

t秒の調理でK枚以上の肉が焼きあがるような最小のtを求める、と考えれば、これは二分探索で求まります。

tを固定したときに、最大で何枚の肉が焼きあがるかを考えます。c_i \times \sqrt{(X-x_i)^2+(Y-y_i)^2} \leq tを変形すると(X-x_i)^2+(Y-y_i)^2\leq (\frac{t}{c_i})^2となるので、i枚目の肉がt秒以内に焼きあがるのは、熱源が中心(x_i,y_i)、半径\frac{t}{c_i}の円の内側にあるときだとわかります。あとは、N個の円が最も多く重なっているような点に熱源を置くだけ!!!

有名問題っぽいのでTwitterで調べてみると、この問題にたどりつきます。何人かの提出を読んで、熱源を置くべき点は円の中心か交点に限られるとわかったので、書きます。

交点の座標を求めるパートにかなり苦戦してしまい、コンテスト中にはACできませんでした…。先に交点を通る直線の方程式を求めてから、円と直線の交点として求めると楽でした。

コンテスト後の提出

反省

  • ケアレスミスをなくす。提出するのを30秒我慢して見直す勇気を持とう!!!マリオカートにおけるブレーキを踏む勇気と一緒。
  • 幾何ライブラリにも手をつけ始めた方がいいのかも。