P3645 「APIO2015」雅加达的摩天楼

因为 doge 不能提前跳过来等待,并且传递消息没有限制,所以我们只关注当前在哪座摩天楼以及当前 doge 可能的跳跃能力。

根号分治,跳跃能力较小的所有 doge 不同的跳跃能力有限,跳跃能力较大的每只 doge 能跳到的位置有限,状态数量只有 \(O((N+M)\sqrt N)\)。但数据范围较小可以直接用 bitset 标记状态是否被遍历过。

因为统计的是跳跃步数,所以传递消息和跳跃一次的花费是不同的。此时需要用到 01BFS,传递消息花费为 \(0\) 塞入队首;跳跃一次花费为 \(1\) 塞入队尾。这样就能时刻保持单调性。

有两个值得注意的细节:

  • 01BFS 在出队时打标记而不是入队时。因为塞入队尾的并不一定是最优的,后续塞入队首可能更优。UOJ 上有 hack 数据。
  • 同一种状态可能会多次入队,但是传递消息只需要一次,需要及时清空对应位置上的 doge 避免多次传递退化成 \(O(M^2)\)
posted @ 2025-03-02 02:22  Sumering  阅读(6)  评论(0)    收藏  举报