CF1599J 题解
题意
给定一个长度为 的数组 ,判断是否存在一个长度为 的数组 ,使得 中每一个元素都可以由 中两个位置不同的元素相加得到。若存在,输出任意一个 。
。
题解
简单分析,如果 中有两个元素相同则肯定可以,如果存在三个数 满足 是偶数则肯定可以。于是接下来只考虑所有数都是奇数的情况。
每个 对应一个点, 对应一条边,则构成一个基环树。对于不在环上的部分,如果不是一条链,则将一个叶子接到另一个叶子下面,显然答案依然存在。于是形态变成了一个环接一条链。也就是一条链加一条连接一个端点的边。
设 ,则 。注意此时 并非输入的顺序。此时仅 未满足。根据上述的分析, 由 与一个 相加得到。由于所有 都是奇数,显然 需要为偶数。则问题转化为在 中找到两个长度相等,和相等的子序列。
由鸽巢原理, 时一定存在。所以 时在前 个中找即可。设 ,复杂度 。
本文作者:realFish的博客
本文链接:https://www.cnblogs.com/fish07/p/17704597.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步