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|\) ,否则答案会变大
因此,我们可以维护每个城市,左边最近的有着一半相同颜色的城市,右边最近的...
如何维护呢?