ABC468 F - Chmax

最大値更新

考え方

最初の数は、$x$ と $y$ のどちらの更新に使っても話が全く同じである。
よって、最初に操作 $1$ を行い $x$ を更新したと仮定して話をする。

$x$ より大きい数が初めて来たときを考える。
このとき、条件から必ず $x>y$ になっており、どちらの操作をしても必ず値が更新される。
そのため、貪欲に $x$ の更新に使うと決めてよい。
なぜなら、$y$ の更新に使った後に可能なすべての操作は、$x$ の更新に使った場合でも可能だからである。
($x$ と $y$ の立場が逆になるが、最終的な $c$ の値は同じである)

その次にまた $x$ より大きい数が来た場合も同様に、貪欲に $x$ の更新に使ってよい。
つまり、これまでで最大の数が来た場合、全て $x$ の更新に使うと決めてよい。
ということで、順列 $P$ の中の該当する個数をとりあえず結果に足し、該当する数を除去する。

残った数は、以下の $2$ つのいずれかに使える。

これの最大個数は、ただの最長増加部分列の問題である。
よって、その個数を結果に足すと、答えになる。

$x$ 更新に使われた数の除去は、以下のどちらでもよい。

計算量は最長増加部分列の処理部分が支配的で、普通の方法なら $O(N \log N)$。

入力例1での動作

入力を受け取る。

n: 5
p: {4, 3, 1, 2, 5}
result: 0

先頭から見て、それまでの最大値を更新する要素を数える。
45 が該当するので、result=2 となる。
また、この $2$ 要素を n+1=6 に書き換える。

p: {6, 3, 1, 2, 6}
result: 2

末尾に n+1=6 を追加する。

p: {6, 3, 1, 2, 6, 6}

この配列の最長増加部分列の長さは $3$ である。
例えば、1, 2, 6 を選べる。
末尾に追加した 6 の分を除いた $2$ を result に加える。

result: 4

注意点

好きな単調増加列を $2$ つ取ることはできない。
例えば、 5 3 4 1 2 の答えは $4$ ではなく $3$ である。
先頭の $5$ に対して、「使わない」という選択は許されていない。

別解

特になし。