加载中...

ABC 395(DEF)

D

确定好需要维护的信息

由于操作2交换巢中的每个鸽子这一步看着很暴力,因此考虑换一种思路:交换两个巢,这样操作的复杂度是 \(O(1)\) 的。

那么如何维护好信息呢?可以新加一种信息来构建鸽子与巢之间的关系——位置。因为位置是固定不变的,所以可以创建如下数组:

  • \(pigeon[i]\):编号为 \(i\) 的鸽子现在所处位置
  • \(pos[i]\):编号为 \(i\) 的巢现在所处位置
  • \(id[i]\):位置 \(i\) 上的巢的编号。

这样操作1只需要修改 \(pigeon\) 数组,操作2 同时交换 \(pos\)\(id\);操作3就相当于查询 \(id[pigeon[i]]\)。具体细节见代码。

code

E

分层图求最短路

图的状态只有两种:翻转与不翻转。因此可以想到分层图:例如,将 “从源点到某点 \(u\),图未翻转” 看作是一个状态,则一共有 \(2 \times n\) 种状态。用 \(Dijkstra\) 求最短路时只需要加一维表示 是否翻转 即可。转移式很好写,具体细节见代码。

code

F

二分

显然 每一对牙最终的总长度 和 上牙整齐程度(指任意两对上牙长度差不超过 \(X\))是具有单调性的,因此考虑二分。

固定了每对牙的总长度,那么每一对牙中 上牙与下牙减少的总长度 就也确定下来了。由于下牙最多可以减少 \(D[i]\) 的长度,因此可进一步确定每颗上牙可减少长度的范围。这样只需要钦定好第一颗牙的长度范围(第一颗牙左侧没有其他牙,只需满足自身约束即可;后面的牙除了要满足自身约束,还需要考虑其左侧牙带来的影响),再递推看其右侧的牙是否可满足条件即可。具体细节见代码。

code

posted @ 2025-03-02 11:54  jxs123  阅读(94)  评论(0)    收藏  举报