CF1615F:LEGOndary Grandmaster 题解
1615F:
题意:定义两个01串的距离是使两串完全相同的操作次数,每次操作可以把两个相邻且相同的数翻转(不能相互到达距离为0),现给你两个带问号的01串,对于问号替换的所有情况,求两串距离之和。(n<=2000)
Solution:
这是一道没有知识积累就无从下手的题。
本题有两个关键转化,逐渐把原本离散型的问题转化为连续性的问题。
第一个转化:奇数位翻转。原来操作是两个相同的数可以一起翻转,这个操作是比较难考虑的,因为0和1的数量在不断变化。而我们先将所有奇数位都翻转,你会发现之后的每次操作从“相邻且相同的数”变成了“相邻且不同的数”翻转,也就是相邻01交换位置,这个题意转换使得方案非常直观,因为0和1的数量不变,每次操作可以挪动一个位置,两串距离也就是把所有1对齐的挪动步数,若1数量不同即为不可相互到达。
第二个转化:用每一位来表示挪动步数的代价。原本我们用 表示 s 串第 i 个 1 的位置, 表示 t 串第 i 个 1 的位置,s 与 t 距离即为 ,但这不利于接下来的统计,因为我们每个问号具体填什么不确定,我们需要把它转化为更加连续性的问题。有个冷门结论:设 为 前缀和, 为 前缀和 (就是 i 之前 '1' 的个数),则 。
为什么等式右边的求和有下标,因为我们把贡献转化到了每一个位置上,我们列举每个位置可能的 情况,求出 n 个位置贡献的和即为答案。
的dp很好求每个位置的 情况, 表示填前 i 位,使 的情况数,只需要枚举每个问号填什么,然后从上一位转移过来。当然,为了让这种情况合法,后 位的填写需要满足后缀合和前缀和相反,才能满足‘1’的数量相等这一前提,我们还需要求出 ,这也是为什么dp状态中 没有加绝对值。
代码有点丑,别指望读了哈哈。
1845E:
补充一个类似的题,这题每次操作可以交换相邻两个01的位置,问正好K次操作后不同的01序列个数。n,K<=1500。
n^3的dp很好设计, 表示前 i 个数, b 的前缀和为 j, 的方案数。
然后发现其实第二维可以缩小到根号,只需要把 j 的定义改为: ,改成差值而不是b的值,因为相邻两个位置 j 的改变量不超过 1,因此要想让 sum 小于 k ,j 的值就不能超过根号。
复杂度
__EOF__

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具