【题解】P4229 某位歌姬的故事 DP
- 一个知识点:给定 \(n\) 条线段 \([l_i,r_i]\) ,将所有 \(l_i\le l_j\le r_j\le r_i\) 的线段只保留 \([l_j,r_j]\) ,后按右端点递增排序,左端点也递增。
一个简单的问题模型
给定 \(m\) 个限制 \((l_i,r_i)\),要求区间 \([l_i,r_i]\) 中至少有一个 \(1\) ,有多少长度为 \(n\) 的序列满足要求。
将区间的限制转化到点上。
对于每个限制 \((l_i,r_i)\) 要么第 \(r_i\) 位为 \(1\) ,要么第 \(r_i\) 位前面第一个 \(1\) 的位置大于等于 \(l_i\) 。
考虑一个 DP :令 \(f[i][j]\) 为考虑前 \(i\) 个位置,最后一个 \(1\) 在位置 \(j\) 的方案数。
对于 \(n\) 巨大多的情况可以采用下面的方法降维。
CF1327F 是在不需要离散化的情况下的 \(O(n\log n)\) 。
限制转化
将限制 \(\max_{l_i\le k\le r_i}(h_i)=m_i\) ,转化成 \(\forall k\in[l_i,r_i] h_k\le m_i,\exists k\in[l_i,r_i],h_k=m_i\) 。
显然若存在 \(l_i\le l_j\le r_j\le l_i\) ,\(m_i < m_j\) 那么无解。
离散化
考虑如上图将给定的区间离散化成若干段。
为了方便,这里将每段区间表示成左开右闭。
考虑预处理出每一段的上界 \(ub_i\) .
对于一个限制 \((l_i,r_i,m_i)\) ,接下来要解决的限制即区间 \([l_i,r_i]\) 中要存在一个 \(m_i\) ,可以发现只有 \(ub_i=m_i\) 的段才会满足该限制。
因此所有 \(ub_i\) 不同的段的取值是互不影响的。
DP
考虑处理每一个 \(m_i\) ,拿出所有 \(ub_j=m_i\) 的段。
预处理一个数组 limit[]
,limit[j]
表示若第 \(j\) 段内没有 \(m_i\) 上一个 \(m_i\) 离第 \(j\) 段最远在哪一段。
同理令 \(f[i][j]\) 为考虑前 \(i\) 段且最后一个 \(h_j=m_i\) 的位置是 \(j\) 的方案数。
复杂度 \(O(TQ^2)\) 。