解题思路
我们需要在一维整数直线上,从当前坐标 s 出发,走到一个不处于任何危险区间内的位置 x,并使得移动距离 ∣x−s∣ 最小。危险区间以闭区间 [li,ri] 的形式给出,且不同区间可能重叠或相邻。
可以把所有危险区间合并成若干个不相交且不相邻的大区间,然后判断 s 是否落在这些合并后的区间内部:
- 将输入的 n 个区间按左端点从小到大排序。
- 依次扫描排序后的区间,合并那些相交或相邻的区间。具体地,若当前区间 [L,R] 满足 L≤cur_r+1(因为整数坐标上,[cur_l,cur_r] 和 [L,R] 若满足 L≤cur_r+1 则它们之间没有空隙),则扩展当前合并区间的右端点为 max(cur_r,R);否则得到了一个完整的合并区间 [cur_l,cur_r]。
- 在每形成一个完整的合并区间时,检查 s 是否落在该区间内(即 cur_l≤s≤cur_r)。