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]]\)。具体细节见代码。
E
分层图求最短路
图的状态只有两种:翻转与不翻转。因此可以想到分层图:例如,将 “从源点到某点 \(u\),图未翻转” 看作是一个状态,则一共有 \(2 \times n\) 种状态。用 \(Dijkstra\) 求最短路时只需要加一维表示 是否翻转 即可。转移式很好写,具体细节见代码。
F
二分
显然 每一对牙最终的总长度 和 上牙整齐程度(指任意两对上牙长度差不超过 \(X\))是具有单调性的,因此考虑二分。
固定了每对牙的总长度,那么每一对牙中 上牙与下牙减少的总长度 就也确定下来了。由于下牙最多可以减少 \(D[i]\) 的长度,因此可进一步确定每颗上牙可减少长度的范围。这样只需要钦定好第一颗牙的长度范围(第一颗牙左侧没有其他牙,只需满足自身约束即可;后面的牙除了要满足自身约束,还需要考虑其左侧牙带来的影响),再递推看其右侧的牙是否可满足条件即可。具体细节见代码。