USACO 2022 Dec 铂金组题解
有生之年终于 AK 一次 Pt 组了,发个题解玩玩。
T1 - Breakdown
大部分情况下,题目里若存在一个很小的 这样的角色,都是因为它在复杂度指数上(包括但不限于 或 )。
时光倒流变成加边。考虑折半,维护 到每个点 / 每个点到 边数为 时分别的最短距离。询问时 meet in the middle,。
怎么维护?考虑到 大概率在指数上,而 ,一个朴素的方法是暴力枚举 步的每一步,。但最多只能接受 时间内更新一次。
设加的边为 。枚举这条边是 条边中的哪条,更新。其实是能平均一次 更新而非 的,因为 本身就确定了两个点。另外,如果这条边充当第一条从 出发的边的话,只能多确定一个点,但 的边本身就只有总边数的 ,恰好抵消了。
这样 时是平方,还是不行。再注意到 时可以利用 的信息;而 时 又有点浪费,可以升级一下, 维护两两点之间跨两步的最短路。利用这些信息,分类讨论可知 时加入的边无论充当第几条,都可以在 时间内完成更新。
总复杂度 。
T2 - Making Friends
当奶牛 离开时,设其所有邻居从小到大依次为 。
如果 直接跳过。
否则,将 互相连接,显然等效于将 与 相连。这就是个邻接表的合并,线段树合并或 set
启发式合并即可。
方便起见,给边按 定向。每次奶牛离开时邻接表大小之和减去初始边数就是答案。
T3 - Palindromes
先考虑怎么算某个串的 cost,这部分比较简单。如果 G 和 H 的数量都是奇数,那就 -1。否则设其中 G 的位置依次为 。显然在最优移动的过程中不会改变两个 G 的相对位置, 与 配对。要将一对 移动到对称的位置,显然至少要花 步数,其中 , 为串长。所以 cost 的一个下界是
容易证明,这个下界能取到:只要从外层往内层依次对齐,将靠内的往外移,对齐总能进行。
-1 和 的那项容易先 处理掉。接下来考虑每一对 的贡献。那就是所有不为 -1 的,让 配对的子串 ,令它们的 ,对 求和。
容易想到将 相等的对放一起处理,从外往内,每次加入所有 并查询贡献,这样每对 只会被加入一次。如果 不带绝对值的话,那直接做完了;可惜是带绝对值的,那只能把 装到 BIT 里,分 两半算贡献,。
奈何它 7500 也卡不了我。共要 次 BIT 操作,其中 是 G 出现次数,常数极小!一个卡常技巧是:G 还是 H 不重要,可以让出现次数较少的作为 G,这样最多要 次 BIT 操作。
这个方法是可以改进为 的。注意到,每次查询的左右端点 分别单调,于是直接单点修改数组并暴力移动指针,就可以 修改,且每个 相等组的查询操作都在 时间内解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2020-12-20 CF1458C - Latin Square 题解