题解: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\),单点加,区间求和,两种颜色分别建一棵线段树来维护即可。

代码

posted @ 2025-08-20 06:40  yutar  阅读(1)  评论(0)    收藏  举报