CF27 Div2

もっとまじめにやりましょう、って感じだった。

A

既に使った値を覚えておいて、使っていない最小の値を教えてくれるマシンがある。使った値のリストが与えられるとき、そのマシンに問い合わせた結果を答えよ、という問題。


やるだけ。

B

N人の人が総当たりで対戦をした結果の一つを除いたものが与えられる。全員には内部的に相異なる強さのパラメータが実は与えられていて、常に強い人が勝つことが保証されている。このとき、除かれた結果を答えよ、という問題。


その二人が勝った人の数が多い方がそれだけ強いということになる。同じ数のときは隣接する二人なので決定できない。(この場合はどっちを答えてもいいらしい。)

C

整数配列が与えられるので、広義単調増加ないし減少でない部分配列のうち最小の長さのものをいずれか答えよ、という問題。


最小の長さのものは常に3であることが保証されているので、適当に探せば良い。取り敢えず、全体が広義単調増加ないし減少なら答えはないので、狭義単調増加ないし減少の位置をそれぞれ探す。どちらかが見つからなければ答えはない。両方とも見つかった場合、それにでてくる3ないし4個の値から、求める配列が作れるので、後は適当に加工して答える。


O(N^2)だと通らない。Div2なので油断した...。

D

円周上に都市がN個並んでいる。二都市間に新たに道を作るとき、円弧とも他の道とも交差しないようにしたい。それぞれの道を円弧の内外どちらに作るべきか答えよ、という問題。


要は2SATなので、Greedyに割り当てをしていって、矛盾が発生しなければそれが答え。矛盾が発生する場合はどうやっても無理なのでそう答える。SATの条件としては、二つの道が円弧の同じ側にあったら交差すること。

E

約数の数がNである最小の整数を答えよ、という問題。


素因数分解したときの、素数のべき乗の値+1の積が約数の数になる。また、できるだけ小さい素数の方に大きいべき乗が来るようにする。これを探索するだけ。long溢れしないらしいので、一番大きいべき乗でも高々2^63程度なのと、Nが1000以下なのでNを素因数分解したときの要素の数は10個程度なので、10番目の素数くらいまで探索すれば十分になることから、十分な速度で探索できる。適当に枝を刈る必要があるかも?