YC317A [ 20240708 CQYC省选模拟赛 T1 ] 划分(partition)

题意

给定一个长度为 \(n + m\) 的二进制数,你需要将这个二进制数划分别划分为长度为 \(n\) 的二进制数 \(a\) 与长度为 \(m\) 的二进制数 \(b\)

你需要输出 \(a + b\) 的二进制形式。

\(n \le 10 ^ 6\)

Sol

考虑发现一些性质。

\(n \ge m\),则:

考虑最优方案给 \(a\)\(b\) 添加字符的过程,注意到一定存在一种最优方案,可以使得在 \(b\) 被填完之前,\(a\) 不会被填任何一个 \(0\)

证明如下,由于可以交换 \(a\)\(b\) 的任意位,所以我们可以认为在过程中 \(n - |a| \le m - |b|\),于是可以发现给 \(a\) 一直填 \(1\) 遇到 \(0\) 就给 \(b\),才会最优。

我们可以考虑设 \(i\) 表示给 \(a\) 分配 \([1, i]\) 中的 \(i - m\)\(1\),剩下的分配给 \(b\),最后接上一段。

这样时间复杂度来到了 \((n + m) ^ 2\)

平凡的,考虑 \(i + 1\) 对最终答案的贡献。

不难发现当 \(s_{i + 1} = 1\) 时对答案无贡献,当 \(s_{i + 1} = 0\) 时,会去掉 \(b\) 的最后一位 \(1\),给 \(a\) 的最后加上一个 \(1\)

可以发现这两个递增递减操作会有交叉,直接找到这个交叉点即可。

时间复杂度:\(O(n + m)\)

posted @ 2024-07-16 21:34  cxqghzj  阅读(1)  评论(0编辑  收藏  举报