yamake's blog

主に競プロ、たまに自転車

Codeforces Round #686 (div. 3) F - Array Partition

この問題を(バチャ終了半年後の今日)自力ACしました。解法自体はわかっていましたが、実装に詰まって放置していました。

問題概要

配列 a が与えられます。両端の連続部分列の最大値 u,w と、真ん中の連続部分列の最小値 v が一致するように、配列を三分割しなさい。

考えたこと

左端の連続部分列を固定した時に、残った部分の最適な分け方を高速に探索できると良さそう、最小値と最大値の組合せなので、配列の長さに単調性がありそう。

解法

真ん中の部分列の右端の値を r とする。r が増加するにつれて u,w は広義単調減少する。したがって、二分探索によってこの境界を求められる。u,v,w を求める時にセグ木を用いると \mathrm{O}(N\log(N)^2) でこの問題を解くことができる。


editorial は尺取り法を使っていました。僕は尺取りでやるやり方がわかりませんでした。editorial の後半の解法もかなり賢かったです。

提出コード