CF1928E: Modular Sequence 题解
E:
题意:你需要构造长度为 n 的数列 a ,满足和为sum,且 ; 或 。(n,sum,x,y<=2e5)
先说下我曲折的做题经历。不想看可以直接跳到solution。
题目很容易让人想到复杂度和根号有关。为了简化描述,先把题意转化为标准形式,即:已知 ,每次可以加一或者归零,构造和为 sum 的数列。
我寻思 应该可过?于是想了个bitset背包的做法,由于要涉及到当前值,我设 表示最后一个数字是 i ,能否使和为 j。枚举第一次归零到最后的长度,用 sum 减去 为首的等差数列就是 j 。然后却卡在了方案输出上,我一开始以为,由于靠前位置的 是当前位置 的子集,所以假如 为1,我就可以让最后一个数字是 i 。后来发现这个贪心是错的,因为你无法确定 这个状态具体有多长,你以为它在通过 不断缩短,但是可能这个状态是要到更长的长度才更新的到。(没看懂很正常,因为这个贪心是我瞎想的)甚至发现不仅正确性没有,复杂度其实是 。然后看题解去了。
看到题解说可以根号分治,我发现好有道理:对任意的 sum,一定可以在根号级别就能把 a 构造出来,所以我们只需要考虑 n 小于根号的情况。然后枚举每一位数填什么也改为了枚举下一个三角形的边长。 表示长度为 i 的数列能不能表示出 j 来。由于 i 最多枚举到根号,因此复杂度为 ,即,枚举位置,枚举下一个三角的边长,对 j 进行背包运算。一交啪叽TLE on test 78。这个复杂度是真不行。于是寻找更靠谱的题解。
Solution:
这是一个比较有启发性的做法。
在上面的做法中一直都在关心某个长度能不能组成 j ,这是由于我们对于输入的 sum,要根据 sum 来算出需要的 j 。但是我们发现拼三角形来达到 j 的这个过程,好像与输入的数据无关,那我们换个思路,预处理出 表示:拼出总和 j 所需的最小长度。放弃使用bitset。
发现问题简化了不少, 可以在 时间预处理。判断有无解时,我们可以枚举 开头的等差数列长度,sum 减去开头长度的得到 j ,比较 与剩余部分的长度。
输出方案则可以枚举最后一个三角形边长 i ,若 说明减掉边长为 i 的三角形后依然有解。这样可以构造出整个序列 a 。
__EOF__

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