C - Not Argmax Editorial by maroonrk_admin
DPを行います. \(dp[l][r]=\) 区間 \([l,r]\) のみを考えたときの答え,とおきます. なお区間 \([l,r]\) を考えるときは,\(l \leq L_i \leq R_i \leq r\) を満たす \([L_i,R_i]\) のみが条件として与えられているとします. \(P_l,\cdots,P_r\) の値域は一般性を失わず \(1,\cdots,r-l+1\) としておきます.
\(dp[l][r]\) の計算方法を考えます. \(P_l,\cdots,P_r\) の最大値の場所 \(m\) で場合分けします. もしも \(X_i=m\) なる条件が課されていたらその \(m\) は不適です. そうでない場合を考えます. まず,\(L_i \leq m \leq R_i\) を満たす条件は以降は無視してよくなります. すると,\(dp[l][m-1]\) と \(dp[m+1][r]\) の計算に問題を帰着することができます. これで \(dp\) の遷移が得られました. なお,左側と右側に割り振る値の集合に自由度があるため,それに対応する二項係数の係数をかける必要があります.
これで \(O(N^3)\) の DP が得られました. なお,各 \([l,r]\) に対して禁止された \(m\) を列挙する必要がありますが,毎回 \(M\) 個の条件をチェックしていると全体で \(O(N^2 M)\) 時間になり遅いです.\(l\) を固定し,\(r\) を増やしながら禁止された \(m\) の位置を管理すると,全体で \(O(NM)\) 時間になり,これなら十分高速です.
計算量は全体で \(O(N^3+NM)\) です.
posted:
last update: