【题解】gym104396G | 贪心 性质分析
一步一步做出来的。很有意思。
考虑 (弱化版)。
我们的目的是为了经过所有题目给出的边一次,考虑构造一个这样的图:
考虑每段相邻两个点之间被经过次数,从左到右和从右到左的次数是相同的,需要将少的一者的次数补至多者的次数,这同时也是答案的下界,答案不可能小于该值(过去了肯定要回来)。
这样形成的每个点入度相同,出度也相同的图,即是一个欧拉图,可以当作若干个环。
而环之间是可以合并的,如下图是两个环的合并,只需要在后者的起点将目前的箱子放下,拐完一圈回来再拿上这个往回。
环之间也是可以合并拆分的,上面两个环和这样两个环其实是等价的所以其实是可以将环拆成这样:
各种形态的环也都可以合并,都只需要从起点下车然后拿上回来的就行。
通过差分,求出两者的次数,然后取 。注意到不一定所有环都有交,将空出的位置补上一次来回即可连通。
环之间具体的形态、关系,我们已经不在乎了。
逻辑关系是这样的:
只要构造出来的覆盖情况满足每个位置被覆盖的次数达到了去边和回边的 ,就一定是若干个上方形态的环(欧拉图),就一定可以通过上方的方式合并起来,所以我们现在的目的就是让每个位置的覆盖次数达到去边和回边的 。
现在,我们就只关心,每段,被覆盖了多少个来回。
先求出每个点需要的覆盖次数,形如这样一个直方图:
的情况下,我们随便转弯的话,其方案就是将其重新拆成这样:
每个环需要转两次弯。
考虑 的时候,我们想要可能减少某些转弯的次数,就可以将几次覆盖串在一起,就是将如图的两次覆盖拼在一起。
能够减少两次转弯,代价是它们之间的距离的两倍,收益是转弯的代价的两倍。
其本质就是 在覆盖次数减少 和增加 的位置需要掉头,而我们可以将一个覆盖次数增加 的位置和一个覆盖次数减少 的位置串起来减少转弯。
所以对于每个覆盖次数减少 的位置,我们肯定会选择和其之后第一个可用的增加 的位置进行配对,如下图。
位置之间互不影响,如果连起来更优(距离不大于 )那么就将两端连在一起。
代码 赛时把负无穷开成 -1e9 + 20 了,怒挂 19分,吐了。
你所积累的东西早晚会用上。所以要不断地,去见识别人没有见过的世界。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970920,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步