注意到我们可以预处理出每个节点走一步能到达的点,显然不会超过 444 个。
设 fl,r,x,yf_{l,r,x,y}fl,r,x,y 为把 l∼rl\sim rl∼r 合并且最终到达 (x,y)(x,y)(x,y) 的最小步数,当做到一个 (l,r)(l,r)(l,r) 时进行区间 dp,然后 bfs 更新当前所有 fff 值。
这样就可以 O(n2whlog(wh))O(n^2wh\log(wh))O(n2whlog(wh)) 了,其中 log\loglog 因子来自于 bfs 前的排序:为了保证 bfs 遍历每个点恰好一次,需要先排序,当队列内最短路到达了当前值时再把该点入队。
参考代码。
注册一个 BZOJ by HydroOJ 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
使用您的 HydroOJ 通用账户