【题解】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\) 那么无解。

离散化

image

考虑如上图将给定的区间离散化成若干段。

为了方便,这里将每段区间表示成左开右闭。

考虑预处理出每一段的上界 \(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)\)

posted @ 2021-10-09 19:15  Themaxmaxmax  阅读(27)  评论(0编辑  收藏  举报