采用广度优先搜索BFS+ 并查集(路径压缩)。
将每个分拣口看作一个节点,从节点 i 可以跳转到区间 ai,bi 内的任意节点,每次跳转的代价为 1,因此可以用 BFS 求最短跳转次数。
但如果直接遍历每个节点对应的区间,最坏时间复杂度为 O(m2),会超时。
使用并查集优化:
某快递分拣中心有 m 个分拣口,编号从 1 到 m。包裹一开始放在 1 号口,需要送到 m 号口。
每个分拣口都配置了一条传送带:若包裹当前停在第 i 号口,可以支付 1 次跳转费用,把它送到闭区间 [ai,bi] 内的任意一个分拣口(任意整数口位 j 满足 ai≤j≤bi)。
请计算:把包裹从 1 号口送到 m 号口,最少需要几次跳转。若怎样跳都到不了,则视为无解。
第一行一个整数 g(1≤g≤2×105),表示询问组数。
接着共有 g 组数据,每一组格式如下:
第一行一个整数 m(1≤m≤2×105),表示分拣口个数。
第二行 m 个整数 a1,a2,…,am。
第三行 m 个整数 b1,b2,…,bm。
保证对每个 i 都有 1≤ai≤bi≤m,且同一文件内所有 m 之和不超过 4×105。
输出一行,包含 g 个整数,相邻整数之间用单个空格隔开。
第 t 个数表示第 t 组询问的答案:最少跳转次数;若无法送达则输出 -1。
输入
3
6
2 3 5 6 6 6
4 5 6 6 6 6
4
1 1 1 4
2 2 2 4
1
1
1
输出
2 -1 0
说明
第一组:m=6。一条最优路线是 1→3→6,共跳 2 次;也可走 1→4→6,同样是 2 次。
第二组:从 1 号口只能在 {1,2} 之间往返,永远进不了 4 号口,故为 -1。
第三组:起点即终点,无需跳转,答案为 0。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册