Codeforces Round674に参加しました(ratedだと思ってたらunratedだった......)、結果は1:19で全完しました(プレテストあるのかな?知らない)!!
a. Floor Number
Petyaくんの住んでいる部屋番号が与えられるので、何回に住んでいるかを答えなさい。
なら1階、
それいがいはをで切り上げ除算して、1を足した数が答えです。
b. Symmetric Matrix
が偶数かつ、行列の中に対照行列があればYESです。
1つの対照行列を規則正しく並べると、対称行列になります。
c. Increace and copy
合計で回、後ろに加える操作を回行った時
1. にをk回加える。
2. を回コピーする。
のように操作を行うと数列の総和は最大となります。
このとき、
が成り立ちます。この式を変形すると
となります。
この式を見ると、を定めるとの最小値が定まることがわかります。
まをで微分すると
となり、はについて下に凸だとわかります。
あとは下に凸な関数の最小値を求めたいので3分探索をします。
僕は三分探索の実装が面倒だったので微分係数を二分探索しました(微分係数は単調増加かつ、最小値では0を取るので二分探索で0を探索してもいけます)。
d. Non-zero Segment
より、累積和が被った時は総和が0となる連続部分列が存在するということになります。
したがって、この問題は「一番左からの累積和が全て異なるように適当な値を挿入する回数を最小化せよ」と言い換えられます。
数列内に適当に大きい値を挿入すると、その値を挿入したあとの累積和は挿入する前の累積和よりも必ず大きくできます。
したがって、
1. 左から順番に見ていき、累積和を逐一取っていって、setなどにいれて管理する。
2. 累積和が被ったとき、今見ている要素の前に適当に大きい値を挿入する。
によってこの問題を解くことができます。
e. Rock, Paper, Scissors
最小値を求めるの難しいんですが、最小費用流を流して解決しました。
f. Number of Subsequences
この問題の適当な提出からACコードをコピー、A, B, Cを小文字に直して提出!w