开车旅行
思路
好长的题面
先考虑 \(70 \%\) 的情况
我们可以方便的 \(\mathcal{O} (n ^ 2)\) 处理每个点下一个会到的点
因为 \(x_i\) 非常的大, 所以我们需要更高效的处理问题, 而不能纯模拟
这个时候我们就可以想到使用倍增的方法, 还是同样的令 \(f_{i, j, 0 / 1}\) 表示从 \(i\) 城市开始, 行驶 \(2 ^ j\) 天, 最初是 \(A / B\) 开车, 最终会到达的城市
令 \(dista_{i, j, 0 / 1}, distb_{i, j, 0 / 1}\) 分别表示 \(A, B\) 开过的距离
整个转移是简单的, 特别的, 对于 \(j = 0\) 时, 需要特殊转移
然后发现排序之后处理每个点下一个会到的点, 瓶颈在重复处理, 考虑链表删除处理过的点即可 \(\mathcal{O} (n)\) 处理
代码
现在肯定没时间打这种题
总结
如果不存在最优解问题, 大概率可以倍增优化
链表用于删除是很好的, 一会去找一个好写的板子