D]競技プログラミングhttps://csacademy.com/contest/round-65/task/count-arrays/Q個の区間がある。i番目の区間は[L[i],R[i]]の区間に少なくとも1つは0が含まれるという条件。全ての区間の条件をみたす長さNのバイナリ列は何通りあるか。「区間について、これをみたす数え上げ」という段階でインラインDP感、区間の右端について左端を隣接リストのように保持して処理していくんじゃないかなという感覚がある。言われてもピンと来ないだろうので、まずは計算量を越えるDPを考えよう。区間についてはまずは無視して考える。i番目の文字列まで確定していて、最後に0があるのがj番目」これを更新していくことを考えよう。遷移を考えると、0を最後に置く、1を最後に置くの2通りがあるので、基本はこれをやればいい。0を最後に置くこれをより、更新しやすくするために、このように変えてみよう。dp[i][j]こうすると、インラインDPで扱えるDPとなる。R]の区間について考えると、dp[R][0]~dp[R][L-1]は条件を満たさない組み合わせ数となってしまう。これはR番目まで確定しているのに最後に0が出て来るのがL-1以下なので[L,R]に0が1つもない状態になるためである。R番目まで確定させた段階でL未満のdp値は無視して考える。0として考える必要がある。これは遅延評価セグメントツリーで[0,L-1]を0としてしまってもいいが、関係してくるのはdp[i+1][i+1]の更新だけなので、0となっている座標を保存しながらやっていっても良い。下の実装では変数lを有効な左端として保持しながらdpのgetを行っている。C]月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。