D. Colored Portals

原题链接

题意

对于有相同颜色传送门的城市 \(i,j\),可以花 \(|i-j|\) 的代价从 \(i\to j\)\(j \to i\)

问从城市 \(x\to y\) 的最小代价,或者报告无法到达

分析

对于无法到达的情况,很简单,用并查集维护即可

而对于可以到达的情况,我们发现,两座城市如果可以互相直接抵达,cost 是确定的

所以我们对与可以直接互相到达的城市,建立双向边,权值为 \(|i-j|\)

然后查询最小代价就变成了查询两个点的最短路

预估时间复杂度 \(O(????)\)

困难点在于,建边需要平方的复杂度,查询两点最短路也很复杂

能不能优化?

我们可以在建边上使技巧

由于只有相同颜色的传送门才会建边,且边权值为城市编号的差

所以我们可以把具有每种颜色传送门的城市剥离开来,然后按升序排序,然后遍历一遍,只在相邻的元素之间建边

这样,图的连通性不变,任意两点间的距离也不变,但是建边的时间复杂度变成了线性

建边的复杂度解决了,查询的时间复杂度仍然很高,我们该如何解决?

为此,我们或许需要换一个方向思考

如果 \(i\) 不能一步到达 \(j\) 说明 \(i,j\) 颜色完全不同,否则可以一步到达

因此,对于一个查询,如果两个城市颜色完全不同,我们只需要找一座中间城市,使得其与两座城市有着一半相同的颜色

而且,如果这座城市在 \([i,j]\) 里,那么答案只是 \(|i-j|\) ,否则答案会变大

因此,我们可以维护每个城市,左边最近的有着一半相同颜色的城市,右边最近的...

如何维护呢?

posted @ 2024-08-21 04:53  纯粹的  阅读(31)  评论(0编辑  收藏  举报