Official

C - Weird LIS Editorial by evima


まず、順列における「LIS 列」の一般的な構造を突き止めましょう。

任意の順列 \((P_1, P_2, \ldots, P_N)\) を考えます。\(A_i\)\((P_1, P_2, \ldots, P_{i-1}, P_{i+1}, P_N)\) の最長増加部分列の長さとし、\(K\)\(P\) 全体の最長増加部分列の長さとします。

明らかに、全ての \(i\) について \(K-1 \le A_i \le K\) です。また、\(P_i\)\(P\) の全ての最長増加部分列に出現するなら \(A_i = K-1\) であり、そうでなければ \(A_i = K\) であることも容易にわかります。

ここで、\(K\) が連続する区間(両端は、\(P\) 自体の端か \(K-1\))を任意に一つ取ります。この区間の左隣の要素(存在しないなら \(0\))を \(L\)、右隣の要素を \(R\)(存在しないなら \(R-1\))とします。この区間内の要素であって \([L+1, R-1]\) の中にないものは明らかに \(P\) のどの最長増加部分列にも含まれないので、この範囲内の要素のみ考えましょう。これらを \(Q_1, Q_2, \ldots, Q_M\) とし、\(Q\) の最長増加部分列の長さを \(K_1\) とします。

\(K\) が、\(A_i = K-1\) であるような \(i\) の個数に上のような区間全てに対する \(K_1\) の和を足したものに等しいことが簡単にわかります。実際、\(A_i = K-1\) であるような \(i\) はどの LIS にも全て使わなければならず、隣り合う二つの \(K-1\) の間(か端)に「挟める」要素の最大数こそが対応する \(K_1\) です。

ここで、LIS 長が \(K_1\) であるような \(Q_1, Q_2, \ldots, Q_M\)(この \(M\) は問題文の \(M\) とは異なります)に対して、\(f(i)\) を位置 \(i\) が終端であるような \(Q\) の最長増加部分列の長さとします。明らかに、各 \(i\) に対して \(1 \le f(i) \le K_1\) であり、\(1\) から \(K_1\) までの全ての整数が現れます。もし \(K_1>\frac{M}{2}\) であれば、\(f(i)\) として一度だけ出現する数が存在することになります。しかし、その場合、その位置にある要素が \(Q\) の全ての最長増加部分列に現れることになり、従って \(P\) の全ての最長増加部分列にも現れることになりますが、それは \(Q\) のとり方に違反します。よって、\(K_1\le \frac{M}{2}\) でなければなりません。

まず、\(A\) の全要素が等しい場合をここで処理しましょう。全て \(K-1\)、または全て \(K\) という二通りがあります。全て \(K-1\) なら、全要素が全ての最長増加部分列に含まれることになり、従って \(K = N\) かつ \(A = [N-1, N-1, \ldots, N-1]\) となります。明らかに、これは順列 \((1, 2, 3, \ldots, N)\) で成立します。

そうでなければ全て \(K\) であり、全ての最長増加部分列に含まれる要素が存在しないことになり、\(K \le \frac{N}{2}\) となります。そのような \(K\) について、対応する順列 \((N-K+1, N-K+2, \ldots, N, N-2K+1, N-2K+2, \ldots, N-K, N-2K, N-2K-1, \ldots, 1)\) を構築することは難しくありません。この最長増加部分列の長さはちょうど \(K\) であり、二つの交わらない最長増加部分列があることが簡単にわかります。

では、\(K-1\)\(K\) が両方存在するとします。すると、上記の要件から以下がいえます。

  • $K$ は、$K-1$ の個数以上でなければならない。
  • $K$ は、($K-1$ の個数) + ($K$ が連続する区間 $Q_1, Q_2, \ldots, Q_M$ 全てに対する $\lfloor \frac{M}{2} \rfloor$ の和) 以下でなければならない。

これらの条件が成り立ち、かつ \(K\ge 3\) (\(A_i \ge 2\) より) であれば、与えられた「LIS 列」\(A\) を持つ順列 \(P\) が存在することを示しましょう。

\(K\) が連続する長さ \(M\)(この \(M\) も問題文のものと異なります)の区間それぞれに対して、\(0\) 以上 \(\lfloor \frac{M}{2} \rfloor\) 以下の数を割り当て、(\(K-1\) の個数) + (割り当てた数の和) がちょうど \(K\) になるようにします。まず、区間に \(0\) を割り当てることについて考えましょう。

区間 \(P[L:R]\)\(0\) を割り当てたとします。(\(K-1\) の個数) + (この区間の左に割り当てた数の和) が \(2\) 以上なら、この区間を区間と呼びます。そうでなければ区間と呼びます。この場合、明らかに、(\(K-1\) の個数) + (この区間の右に割り当てた数の和) は \(2\) 以上です。

区間の長さの合計が \(R_{total}\) なら、これらの区間に数 \(R_{total}, R_{total}-1, R_{total}-2, \ldots, 2, 1\) を一つずつ入れていきます。区間の長さの合計が \(L_{total}\) なら、これらの区間に数 \(N, N-1, N-2, \ldots, N-L_{total}+1\) を一つずつ入れていきます。

では、残りの位置を埋めていきましょう。次のように、残りの数を残りの位置に一つずつ入れていきます。現在の位置が \(A_i = K-1\) であるような \(i\) なら、未使用の数のうち最小のものを入れます。正の数 (\(K_1\) とします) を割り当てられた長さ \(M\) の区間を埋めるときは、未使用の数のうち最小の \(M\) 個を上記のパターン \((M-K_1+1, M-K_1+2, \ldots, M, M-2K_1+1, M-2K_1+2, \ldots, M-K_1, M-2K_1, M-2K_1-1, \ldots, 1)\) に従って入れます (それぞれに定数を足した上で)。

抽象的な内容が続いてしまいましたが、例を挙げます。\(A = [4, 5, 5, 5, 4, 5, 5, 5, 5, 5, 4, 5, 5]\) とします。すると \(K = 5\) で、\(K-1\)\(3\) 個あるので、 \(K\) の区間三つに「\(2\)」を配分します。最初の区間に \(0\)、中央の区間に \(2\)、最後の区間に \(0\) を割り当ててみましょう。すると最初の区間は区間、最後の区間は区間となり、ひとまず \([?, 13, 12, 11, ?, ?, ?, ?, ?, ?, ?, 2, 1]\) と埋めます。残りの要素を入れると、中央の長さ \(5\) の区間が \([4, 5, 2, 3, 1]\) に定数を足したものになることに注意して、\([3, 13, 12, 11, 4, 8, 9, 6, 7, 5, 10, 2, 1]\) となります。

ここで、この順列が要件を満たすことの確認はそこまで難しくありません。これが長さ \(K\) の増加部分列をもつことは明らかです。どの増加部分列にも、\(K\) が連続するどの区間からも \(K_1\) 個より多くの要素が入ることはない(\(K_1>0\) なら)ことに注意します。また、区間や区間に含まれる数は降順に並ぶため、増加部分列に含まれるのは \(1\) 個までであることにも注意します。

\(P\) の最長増加部分列であって区間の要素 (\(P_j\) とします) を含むものが存在したとします。すると、この部分列には \(P_j\) より右にある要素は一つも含まれません。なぜなら、順列の構築方法より、\(P_j\) はそれらの要素のどれよりも大きいためです。他方、(\(K-1\) の個数) + (\(P_j\) より左側での \(K_1\) の和) は \(K-2\) 以下であるため、この部分列の長さは \(K-1\) 以下となり、矛盾します。同様に、\(P\) の最長増加部分列であって区間の要素を含むものも存在しないため、これらの要素は無視できます。

残りの要素については、その一部 (正確には、\(A_i = K-1\) であるような位置 \(i\) の要素) は先頭からの最大値と末尾からの最小値をともに更新する値であるため、どの最長増加部分列にも必ず存在します。その他の要素に関しては、そのいずれについても、その要素を含まない最長増加部分列が存在します。よって、与えられた「LIS 列」\(A\) を持つ順列 \(P\) が成立することを証明できました。

しかし、それは問題の一部であり、まだ要件を満たす列を数える必要が残っています。まず、全ての \(A_i\) が等しいような列を数えますが、これは簡単です。ここで、列に \(K-1\)\(X\) 個存在し、\(K\) が連続する区間全てに対する \(\frac{M}{2}\) の和が \(Y\) であるとします。このとき、明らかに、そのような区間であって奇数長のものはちょうど \(N - X - 2Y\) 個存在します。このような \(X, Y\) の組であって \(0 \le N-X-2Y \le X+1\) を満たすものを全て試しましょう。そのような各組について、\(K\) を固定すると、\(X+1\) 個の区間のうち奇数長にするものの選び方が \(\binom{X+1}{N-X-2Y}\) 通りあり、その後 \(K\) 二つからなるブロックを \(X+1\) 個の区間に配分することになり、これには \(\binom{X+Y}{X}\) 通りの方法があります。結局、使える \(K\) の値は \(X \le K \le X+Y\) のみであるため、答えに \(\binom{X+1}{N-X-2Y} \cdot \binom{X+Y}{X} \cdot max(0, min(M, X+Y) - max(2, X)+1)\) を足すことになります。

合計計算量は \(O(N^2)\) です。

おまけ: \(O(N)\) で解いてみてください。

posted:
last update: