Count Binary Sequence

2 secs 1024 MB
seekworser's icon seekworser

条件の正規化


この問題の制約について、以下の3つの性質が成り立ちます。

LiL_iが同一でRiR_iのみが異なる条件が複数ある場合、最もRiR_iが小さい条件のみを考慮すれば他の条件は考慮する必要はありません。

(最もRiR_iが小さい条件のみを考慮すれば、他の条件は自動的に満たされます。)

したがって各LiL_iについて最もRiR_iが小さい条件のみを残すことで、高々NN個の条件のみを残して他を無視することができます。

②また、2つの条件[LiL_i, RiR_i], [LjL_j, RjR_j] (iji \neq j)であってLi<LjL_i < L_jRi>RjR_i > R_jとなる条件がある場合、

これらの条件を[LiL_i, Rj\underline{R_j}], [LjL_j, RjR_j]と置き換えても良いことも分かります。

③最後に、あるLLについてそこから始まる制約が一つもない場合ですが、これはLi>LL_i > Lとなる全ての制約に渡ってRiR_iの最小値を取った値をRRとして、制約[L,R][L, R]を問題に追加しても構いません。この条件は他の条件が満たされれば自動的に満たされます。

これらの3つの性質から、任意の条件は以下のようなNN個の条件に置き換えることができることが分かります。

[11, R1R_1], [22, R2R_2], ... [NN, RNR_N] (1R0R1RNN+11 \leq R_0 \leq R_1 \leq \cdots \leq R_N \leq N+1)

(ただし、Ri=N+1R_i=N+1となる条件は任意の数列について常に満たされているとみなします。)

これを数列R=R = [R0R_0, R1R_1, ..., RNR_N]と同一視します。

RRの計算は愚直に行ってO(M+N)O(M+N)で可能です。

DP


以下のDPを考えます。

dp[i]=dp[i]=(長さiiの01列で、全ての条件を満たすものの個数)

長さiiの数列が与えられたとき、その末尾に00もしくは11のうち

現在数列の末尾ではない方の数字を高々Rii+1R_i - i + 1個付け加えた数列も

全ての条件を満たしているため、

配るDPとしてdp[i]dp[i]からの遷移は以下のように書くことができます。

dp[j]=dp[j]+dp[i]dp[j] = dp[j] + dp[i] (i+1jRi)(i+1 \leq j \leq R_i)

計算量はO(M+N2M + N^2)です。

累積和等を用いてDPの遷移をO(11)にすることで、この問題をO(N+MN+M)でも解くことができます。