Educational Codeforces 65-E:Range Deleting

これが解けて紫になった。

解法

 (A_i,i)をsortした列を考える。この列を眺めていると、区間(l,r)を消去できることの必要条件は

  • 上で述べた列について、A_iの値がl未満のところまでは昇順である」かつ「A_irより大きいところからは昇順である」

が成り立つことである。M(a)a=A_iであるiの最大値、m(a)a=A_iであるiの最小値とする。すると、aa+1が昇順に並ぶかどうかは、M(a)\lt m(a+1)かどうかを見ればよく、容易に判定できる。
 このことをもとに、lを固定したときに条件を満たすrがいくつあるかを数えよう。例えばl=1のとき、条件を満たすrの値の最小値はm(r-1)\gt M(r)かつM(1)\lt m(r+1)を満たす最大のrである。m(1)\lt M(2)だとしてl=2のとき、条件を満たすrの値の最小値は、l=1のとき以上であるか、存在しないかのどちらかである。これは、M(1)\lt M(2)であることから容易にわかる。このようにして、lの値を小さい順に調べ、その都度あり得るrの値の最小値を尺取り法の要領で更新することで、組(l,r)の個数を数えることができる。計算量はO(N+X)であり、十分高速である。

実装

Submission #54221712 - Codeforces


問題を見てこれは解けないといけなさそうだと思ったので、解けて嬉しかった。こどふぉのレートが上がるのは自力がついてきた実感があって良い。