【题解】CF1327F AND Segments 动态规划、双指针、单调性

题目链接

注意到,每位独立,因此考虑拆位之后按位处理。

对于每一位转化后的问题即:给定若干条约定 \((l,r,1)\) 要求区间 \([l,r]\) 内均为 \(1\)\((l,r,0)\) 要求区间 \([l,r]\) 内有至少一个 \(0\)

如果没有第二类限制,我们可以用差分在 \(O(n+m)\) 的时间内实现区间覆盖,看一下哪些位置要求必须是 \(1\)

那么我们这样就可以确定哪些位置可以填 \(0\) ,考虑将所有限制转移到右端点:

  • 对于右端点 \(r\) 左边第一个是 \(0\) 的位置 \(pos\) 应满足 \(pos\ge limit\)

预处理出 \(limit\) ,不难设计一个 \(\text{DP}\)

  • \(f[i][j]\) 为有多少长度为 \(i\) 的且最后一个 \(0\) 的位置是 \(j\)\(01\) 序列满足对于所有 \(1\le k\le i\) 的端点 \(k\) 左边第一个是 \(0\) 的位置 \(pos_k\ge limit_k\)

我们用 \(P[i]\) 表示第 \(i\) 位位置是否强制为 \(1\)\(1\) 为是,\(0\) 为否。

不难写出转移方程:

\[f[i][j]=\left\{\begin{matrix} & f[i-1][j] &limit[i] \le j< i \\ & \sum_{k}f[i-1][k] &i = j\\ & 0 &limit[i] > j \end{matrix}\right. \]

可以使用线段树在 \(O(n\log n)\) 的时间内维护。

但实际上我们可以利用题目性质(单调性)在 \(O(n)\) 的时间内求解。

对于两个限制 \((l_1,r_1,0),(l_2,r_2,0),l_1\le l_2\le r_2\le l_1\) ,那么限制 \(l_1\) 是一定不需要考虑的。

那么我们将所有的这样的 \(l_1\) 去掉之后,一定是可以保证按右端点单调递增左端点单调递增的,那么一位置 \(limit_k\)\(k\) 单调递增。

那么我们就可以双指针维护所有合法状态的和。总的复杂度 \(O(k(n+m))\)

代码记录

posted @ 2021-10-27 00:22  Themaxmaxmax  阅读(45)  评论(0编辑  收藏  举报