trsing’s diary

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

AtCoder Beginner Contest 130エア参加メモ

堀で気力が死んでました。体調不良によりやむなく参加を見送りました。

C - Rectangle Cutting

長方形を二つに分け、小さい方の最大値。なので最大でも面積の半分になります。

真っ二つに分けることができれば話が早いですが、その方法は?というと与えられた点から中心に線を引けば真っ二つ。

与えられた点が中心ではないなら1本のみ。与えられた点が中心なら無限に引けます。

f:id:trsing:20190622142047p:plain
与えられた点が中心からずれている場合。一本のみ
f:id:trsing:20190622142131p:plain
与えられた点が中心の場合。好きなだけ線を引くがいいさ

余談

「二つの長方形に分ける」と誤読したため延々と悩んでました。この方針でもAC結構出た(7/10)ため誤読に気づかず何か見落としてるケースが?と小一時間。日本語の勉強からですねぇ…。

D - Enough Array

ある連続部分列に含まれる全ての要素の値の和がK 以上になれば、1\leq a_{i}のためその後も全部K以上になる。(1~iでK以上なら1~i+1、1~i+2、…もK以上)。

f:id:trsing:20190622142349p:plain

K以上となる区間を見つけて残りを足し合わせる、というのを繰り返せばいい。尺取り法でやった。

f:id:trsing:20190622142523p:plain
こんな感じで

E

そのうちやる*1

F - Minimum Bounding Box

AC取った(@2019/6/24)のでメモ

次の解説記事がすごくわかりやすかったです。

betrue12.hateblo.jp

私の理解でざっくりと書くと、

傾きが変化する時刻のどれかが答えとなる時刻となります。
傾きが変化する時刻の候補は、与えられた点をグループに分け、各グループ間の最大・最小値が重なる点です。

軸ごとに3つのグループに分けます

  1. 動かないグループ(x:U,D、y:R,L)
  2. 正方向に動くグループ(x:R、y:U)
  3. 負方向に動くグループ(x:L、y:D))

各グループについて最大・最小値を記録します*2

傾きが変化する時刻ですが、まじめに考えると面倒なので、単純に各グループ間の最大・最小の差分の絶対値を取ってそれぞれの時刻を調べりゃいいと思います。高々2x2x3x2+1の25個*3、十分間に合います。

*1:といいつつ放置してものが増えてきたような…

*2:最大値、最小値以外はなくても良い

*3:2x2(二つのグループの最大・最小)x3(比較するグループの選び方)x2(x,y)+1(時刻0)