geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

AtCoder Beginner Contest 279 備忘録

コンテストページ: TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279) - AtCoder

コンテスト中AC:A〜D
コンテスト後にE,Fを自力AC。

D - Freefall

下に凸な関数っぽい感じだったので、下のサイトを参考に三分探索しました。
三分探索を救いたい - Qiita

誤差が出てくるので、出てきた操作回数±10くらいの範囲を探索しました。
一応、ACできましたが、疑問がいくつか残ったままだったので、コンテスト後に調べてみました。

整数の三分探索の方法

公式解説によれば、繰り返しの条件をr - l > 2として、終了後にrからlまでの最小値を答えれば良いようです。
おそらく、3分する点がlと重複しない間は探索を繰り返すものと思います。

探索範囲の最大値

t\geq \frac{A}{B}ならf(t) \geq f(0)となるので解は\frac{A}{B}以下となる、ということらしいです。詳細は公式解説参照。

下に凸であることの判定

上に凸,下に凸な関数と二階微分 | 高校数学の美しい物語
上記サイトによれば、二階微分が非負整数なら下に凸と判定できるそうです。

ざっくりとした理由をメモしておきます。

まず、一階微分は接線の傾きであり、下に凸の場合単調非減少となる必要があるそうです。確かに、下に凸の二次関数などを例に考えれば、最小値より前は傾きが負で、最小値に近づくにつれてだんだん傾きは小さくなり(0に近づき)、最小値で0になります。そして、その後は傾きは正になり、傾きは大きくなっていくことが想像できます。
そして、傾きが単調非減少になるためには、傾きの変化量は常に非負である必要があるので、二階微分が非負になるということが理解できます。

高校数学から大分遠ざかっていたので、微分を思い出しながら実際にやってみます。

f(x) = Bx+\frac{A}{\sqrt{x+1}}

• 一階微分
Bxの項はBになります。

次にAを含む項です。

合成関数の微分を思い出すと、

u = x+1,\ f(u) = \sqrt{u}

のとき、

\{f(u)\}' = f'(u)u'

です。
Aを含む項は、

\frac{A}{\sqrt{x+1}}=A(x+1)^{-\frac{1}{2}}

ですから、その微分は、

A\cdot -\frac{1}{2}\cdot (x+1)^{-\frac{3}{2}}\cdot 1
 = -\frac{1}{2} A (x+1)^{-\frac{3}{2}}

よって、

 f'(x)=B-\frac{1}{2} A (x+1)^{-\frac{3}{2}}

です。

• 二階微分
同様に合成関数の微分を使うことで、

f''(x) = -\frac{1}{2} A \cdot -\frac{3}{2}(x+1)^{-\frac{5}{2}}
= \frac{3}{4} A (x+1)^{-\frac{5}{2}}

となります。x\geq 0において、f''(x)\geq 0が成り立つので、下に凸であることが示されました。

提出コード: Submission #36819682 - TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)

E - Cheating Amidakuji

このユーザ解説と同じ方法でした。

実装: Submission #36848977 - TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)

F - BOX

公式解説と同じ方法でした。

実装: Submission #36835935 - TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)