Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)

問題概要

長さ  n の数列 a が与えられる. このとき好きな回数だけ(0回でも)以下の操作のいずれかを行い, 新たに数列 b を作る:

  • a の要素のうち最も左の要素を b の末尾に追加し, a からその要素を削除する.
  • a の要素のうち最も右の要素を b の末尾に追加し, a からその要素を削除する.

このようにして作る b を狭義単調増加になるようにつくるとき, b の最大の長さは?(操作列も作る)

問題へのリンク

制約

  •  1 \le n \le 2\times 10^5
  •  1 \le a_i \le 2\times 10^5

解法

 l = 1, r = n のようにカーソルを置いて, l を右へ, r を左に動かしていく感じで毎回  a_l, a_r のどちらかを取るかを選択することにします.

まず,  a_l \neq a_r なら話は簡単で, とれるなら小さい方, とれないなら大きい方, どっちも取れないならおしまいです.  a_l \lt a_r にもかかわらず  a_r をとると,  a_l をとれたのにこれ以降取れなくなってしまい得られる数列が最大ではなくなってしまいます. 

問題は  a_l = a_r の時ですが, このとき選択しなかったほうはこれ以降選択することができなくなります(狭義単調増加になるようにとらなければならないので). よって, これ以降左からしかとらないパターンと, 右からしかとらないパターンを両方ためして長い方を採用すれば良いです.

実装

可読性, おしまい

Submission #145094706 - Codeforces