ABC140E - Second Sum
問題概要
からなる順列がある。となるを選んだ時、の中で 2 番目に大きいものをとする。
この時、を求めよ。
制約
解法
問題が短くわかりやすいので一見簡単そうに見えるが、難しい。
となる部分列の数
愚直にやるとの選び方で、各部分列のを見つけるためになので、全体としてはとなってしまい間に合わない。
そこで、「ある部分列のを求める」のではなく、「各について、となる部分列の数を数える」ことを考える。
の値がになっている、つまり 2 番目に大きくなっているような部分列とは、
のようなものや
のようにより大きいものを一つだけ含むような部分列である。
このような部分列の数を考えるために、以下のような、よりも大きな値を赤色で表示した図を考える。となる部分列とは、この図において、と「赤色のものを 1 つだけ」含む部分列である。
そのような部分列の数は、のすぐ左側か右側の赤を含んだ部分列をそれぞれ考え、そこから左右にどれだけ伸ばす余地があるかを調べることでカウントすることができる。
上の例で、左側の赤を含んだ最低限の部分列は以下のようになる。
この部分列から、赤を含まないように両端を伸ばすことを考えると、
- 左には 0,1
- 右には 0,1,2
だけ伸ばすパターンが考えられ、パターンの部分列が作れる。
右側の赤を含んだ部分列の場合も同様に
- 左には 0
- 右には 0
伸ばすパターンがあり、パターンの部分列が作れる。(つまり、これ以上伸ばす余地がない)
左右のパターンの合計はとなる。
となる部分列の数を求める順番
に対して上記のような計算をするためには、よりも大きい数の出現位置が分かればよい。 よって、の値が大きい順に部分列の数を求めていき、求めおわったの出現位置を記録していけば効率的に計算することができる。出現位置の記録を二分ヒープなどで行うことで、のすぐ左にある赤、そのすぐ左にある赤、のすぐ右にある赤、そのすぐ右にある赤をそれぞれで求めることができるため、全体としてもで問題の解が求まる。