ABC 395(DEF)

D

确定好需要维护的信息

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

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

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

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

code

E

分层图求最短路

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

code

F

二分

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

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

code

posted @   jxs123  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩