blogskol

思わず声に出して読みたくなるブログ

AGC056B-Range Argmax

B - Range Argmax

解説の補足程度

基本方針

xについて、xを作るpのうち辞書順最大のものと一対一対応をさせる
これにより、そのようなpを数え上げる問題になる

以下0-indexed

pの値を降順に決めていくことを考える
つまり、p^{-1}(N-1),p^{-1}(N-2),...,p^{-1}(0)を前から決めていく
上から決めていくことで、使用した index を含む各区間xの値が決まっていることになる

p^{-1}(9)=4とした時の例
f:id:drogskol:20211205114458j:plain
上の例では、4を含む2つの区間xの値が決まったことになる
したがって、[0,3][5,9]についての問題に出来たように見える
p[0,3]=[5,8] p[5,9]=[0,4] のように使う)

しかし、このような key がO(N^2)区間DPでは辞書順最大でないpも数えてしまう
(中略)
したがって、p(i)=8 として良いiは、4を含む区間に含まれている必要がある
つまり、上の例では [0,3]で最大値のindexが2以上[5,9]についての問題に帰着される
そこで、
dp[l][r][m]:[l,r]の順列で最大値のindexがm以上となるものの個数
という区間DPを考える
遷移をO(1)で行えれば良く、以下の式変形に注目する


\begin{aligned}
dp[l][r][m] &= \sum_{i=m}^r (最大値のindexをiとした時の値) \\
&= (最大値のindexをmとした時の値)+ dp[l][r][m+1] \\
\end{aligned}

したがって、最大値のindexをmとした時の値を考えればよく、これは


\begin{aligned}
dp[l][m-1][A(l,r,m)] \times dp[m+1][r][m+1] \\
(A(l,r,m)=argmin\{ L_i | l\leq L_i\leq m\leq R_i\leq r\} )
\end{aligned}

であるから、前計算などでAを求めれば良い

コード