打打打打打字机|

realFish

园龄:3年1个月粉丝:3关注:0

CF1599J 题解

题意

给定一个长度为 n 的数组 b,判断是否存在一个长度为 n 的数组 a,使得 b 中每一个元素都可以由 a 中两个位置不同的元素相加得到。若存在,输出任意一个 a

2n103,1bi106

题解

简单分析,如果 b 中有两个元素相同则肯定可以,如果存在三个数 x,y,z 满足 x+yz 是偶数则肯定可以。于是接下来只考虑所有数都是奇数的情况。

每个 ai 对应一个点,bi 对应一条边,则构成一个基环树。对于不在环上的部分,如果不是一条链,则将一个叶子接到另一个叶子下面,显然答案依然存在。于是形态变成了一个环接一条链。也就是一条链加一条连接一个端点的边。

a1=x,则 a2=b1x,a3=b2b1+x,a4=b3b2+b1x,。注意此时 b 并非输入的顺序。此时仅 bn 未满足。根据上述的分析,bna1 与一个 ai 相加得到。由于所有 b 都是奇数,显然 i 需要为偶数。则问题转化为在 b 中找到两个长度相等,和相等的子序列。

由鸽巢原理,(nn/2)>106×n2 时一定存在。所以 n>27 时在前 27 个中找即可。设 m=min(n,27),复杂度 O(m2m)

本文作者:realFish的博客

本文链接:https://www.cnblogs.com/fish07/p/17704597.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   realFish  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起