题解:P9561 [SDCPC2023] Colorful Segments
提供一种不一样的状态设计。
将所有区间按右端点排序后,设 \(dp_{i,j,k}\) 表示前 \(i\) 个区间中,选出的右端点最靠右的颜色为 \(k\) 的区间,其右端点位于 \(j\) 的方案数。
如果不选第 \(i\) 个区间,\(dp_{i-1,j,k}\) 对 \(dp_{i,j,k}\) 作贡献。
如果选第 \(i\) 个区间:
对于 \(k \not= c_i,j<l_i\),也就是不与任何异色区间相交的情况,\(dp_{i-1,j,k}\) 同样对 \(dp_{i,j,k}\) 作贡献。
对于 \(k = c_i\),右端点最靠右的颜色为 \(k\) 的区间必定为区间 \(i\),故对于任意 \(j<l_i\),\(dp_{i-1,j,k \operatorname{xor}1}\) 对 \(dp_{i,r_i,k}\) 作贡献。
整理可得:
\[dp_{i,j,k}=dp_{i-1,j,k} + dp_{i-1 ,j,k}[j<l_i,k\not= c_i]
\]
特别地,
\[dp_{i,r_i,c_i}=dp_{i-1,r_i,c_i}+\sum_{j<l_i}dp_{i - 1,j,c_i \operatorname{xor}1}
\]
滚动数组后,操作就变为了区间乘 \(2\),单点加,区间求和,两种颜色分别建一棵线段树来维护即可。

浙公网安备 33010602011771号