从一个点向外射出 n 条足够长的线段形成一个环,逆时针顺序依次编号为 1\sim n,其中有 m 条边连接两个相邻线段上的两个点,满足这两个点到原点距离相等,且任意两条边到原点的距离不等。现在从原点出发,初始选择一条线段,然后一直向外走,若遇到一条边则立即沿着边走到另一侧并继续往外走,直到走到某条线段的端点。现在希望最后走到第 s 条线段的端点。你可以加入任意多条边,这些边也要满足两点到原点距离相等和任意两边距离不等的要求。对于每个 i,求出至少要加入多少条边。n\le 2\times 10^5,m\le 5\times 10^5。
思路
容易发现这个过程是可逆的,即从一个位置出发的下一步是唯一的,而从一个位置向后倒推也能唯一推出从原点到这个位置的路径是什么样子的。因此一个简单的想法是从 s 出发倒着做,则我们需要处理一个最短路状的问题。
考虑一种类似扫描线的想法,倒着扫描每条边,实时对每个 i 维护当前已经考虑过的部分中,从 s 到 i 所需增加的最少的边的数量,记为 f_i。则考察加入一条边对 f 产生的影响是什么。假设加入了 (x,y) 这条边,则在这条边上面的路径向下走的时候,x 会走到 y,y 会走到 x,因此影响是 f_x,f_y 互换。此后,我们开始加入一些边。容易发现我们加入的边一定按照先后顺序形如 (l,l+1),(l+1,l+2),\cdots,(r-1,r) 或反过来。目的是为了从 f_l 更新到 f_r。这样我们就得到了一个暴力的做法,每次暴力枚举 l,r 并更新。这样做的复杂度是 O(mn^2)。