UCup 5th-4 D. Don't Fight The Music

题目的限制与前后缀在值域的连续段相关,于是考虑一个比较暴力的做法,直接记 \(f_{i, j, k}\) 表示 \(1\sim i\) 的值构成了 \(j\) 段,\(i + 1\sim n\) 的值构成了 \(k\) 段是否合法,转移只需要考虑插入 \(i + 1\) 后的变化。

记 \(x = k - j\),一定有 \(-1\le x\le 1\)。\(x = 1\) 时说明 \(1, n\) 都在 \(i + 1\sim n\) 中,\(x = 0\) 时说明有一个在前缀有一个在后缀,\(x = -1\) 说明都在前缀,于是过程中 \(x\) 一定是从 \(1\) 最后变为 \(-1\)。

把状态换为 \(f_{i, x, j}\),考察 \((x, j)\) 的转移(记 \(1\) 表示在前缀,\(0\) 表示在后缀,\(|\) 代表边界):

  • \(101\to 111\),合并前缀的两个段,此时前后缀的段数都 \(-1\),\((x, j)\to (x, j - 1)\)。
  • \(1001\to 1101\),扩张一个段,前后缀段数不变,\((x, j)\to (x, j)\)。
  • \(10001\to 10101\),新开一个段,前后缀段数都 \(+1\),\((x, j)\to (x, j + 1)\)。
  • \(|01\to |11\),为边界的值且与当前的段相邻,前缀段数不变后缀段数 \(-1\),\((x, j)\to (x - 1, j)\)。
  • \(|001\to |101\),为边界的值且不与当前的段相邻,前缀段数 \(+1\) 后缀段数不变,\((x, j)\to (x - 1, j + 1)\)。

再考虑题目的限制,\(a_{i} = 1\) 相当于是只有 \((1, 1), (0, 1)\) 合法,\(a_{i} = 0\) 相当于除 \((1, 1), (0, 1)\) 均合法。\(b_{i + 1} = 1\) 相当于只有 \((0, 1), (-1, 2)\) 合法,\(b_{i + 1} = 0\) 相当于除 \((0, 1), (-1, 2)\) 均合法。
且只考虑 \(1\le i\le n - 1\) 的部分(此时有 \(0\) 也有 \(1\),所以 \(0, 1\) 的段数都不为 \(0\)),定义域为:\(x = 1\) 或 \(x = 0\) 时,\(j\ge 1\);\(x = -1\) 时,\(j\ge 2\)。也就是限制相关的点都是每个 \(x\) 的第一个值。

结合转移的方式,有理由认为 \(f_{i, x}\) 合法的 \(j\) 会构成一个区间 \([l_{i, x}, r_{i, x}]\)。转移即为 \(f_{i + 1, x}\gets f_{i + 1, x}\cup [l_{i, x} - 1, r_{i, x} + 1], f_{i + 1, x - 1}\gets f_{i + 1, x - 1}\cup [l_{i, x}, r_{i, x} + 1]\)。限制也相当于是取并集,因为是区间,求交并都可以只通过维护左右端点得到,直接 dp 即可。

最后的构造只需要逆序回去判断每个 \(i\) 插入时属于上述的 \(5\) 类中的哪一类并正向根据类别构造即可。

时间复杂度 \(\mathrm{O}(n)\)。

我这个做法可能有点难写,submission。

这个做法好像可以继续做 A 题,等我学习一下 gpt 的做法。

posted @ 2026-10-25 20:35  rizynvu  阅读(9)  评论(0)    收藏  举报