Gravatar
op_组撒头屯
积分:3036
提交:338 / 677

Pro3575  [USACO21Feb Platinum]Minimizing Edges

只要不失去你的崇高,整个世界都将为你敞开。


喜报:本人在写完本文后,由于网站自动注销,且文章没有保存,成功丢失了全稿。现在这篇是本人又码了一遍得到了。令人忍俊不禁。


注意到 $f$ 只与原图的奇/偶最短路有关,那么每个点在两个图上的奇/偶最短路应该都是相同的。

若原图是二分图,那么答案为任意一棵生成树。

否则,所有点的奇/偶最短路均存在,记作 $(x,y)$。又发现两者的顺序无影响,于是不妨令 $x \lt y$。

考虑一个点 $(x,y)$ 的连边方式:

1. $(x-1,y-1) \to (x,y)$.

2. $(x-1,y+1) \to (x,y) \gets (x+1,y-1)$.

3. $(x-1,x+2) \to (x,x+1) \gets (x,x+1)$.

实际上③是②在 $y=x+1$ 时的特殊情况,但是很有用。


注意到②③中 $x+y$ 是不变的,这启示我们将点按照 $x+y$ 分层。而①中又有 $y-x$ 不变,这启示我们在每层中按照 $y-x$ 升序。

此时我们的连边方式就变得直观了。考虑在以 $x+y$ 为横轴,$y-x$ 为纵轴的坐标系中,我们的连边方式体现为:

1. 向正下方的点连边(如果存在)。

2. 向左右的点分别连边 (如果存在)。

3. 每层最右侧的点,若是 $(x,x+1)$,那么它可以和自己连边。

可以画个图理解一下。

显然①是最划算的,但问题是 $(x-1,y-1)$ 可能不存在,此时我们必须使用②③。

分析一下②③,可以发现本质是将一条链不断往右延伸,并最终在 $(x,x+1)$ 内部消化。显然我们应该将链两两配对,来省去一般代价。


现在我们来分讨一下策略。

考虑点 $(x,y)$,记它包含 $cnt$ 个节点,令 $(x-1,y-1)=fa,(x-1,y+1)=lst$,那么:

1. 若 $fa$ 存在, $lst$ 不存在。那么就直接全连①即可,不向后面留任何链头。

2. 若 $fa$ 不存在, $lst$ 存在。那么就只能全连②,并向后留 $cnt$ 个链头。

3. 若 $fa$ 与 $lst$ 均存在。分析一下可以发现,我们应该让前面的链头尽量分散地连到当前点,再向右传递下去。如果还有剩的,就用①连。

4. 若 $fa$ 与 $lst$ 均不存在。显然这是不可能出现的,因为原图的存在实际上已经为有解做了保障。

可以发现,只有②会产生链头。

最后我们会到达本层的最右端。

若它为 $(x,x+1)$。记它后面还有 $c$ 个链头,通过两两配对,只需要 $\left \lceil \frac{c}{2} \right \rceil $ 的代价。

否则,因为有解,本层一定不存在任何链头。


其实还没完,由于节点 1 并不需要连边,需要特殊处理。要留意一下节点 1 有自环的情况。

可以用 map 之类的实现,时间复杂度 $O(n\log n)$。



2024-03-23 22:39:14    
我有话要说
暂无人分享评论!