胸和钥匙 无敌做法

· · 题解

前言

upd: bitset 做法假了,改成根号分治了。

[AHOI2022] 钥匙

有朋友说看不懂,那我修改下文风。这个新文风我是煮了又煮,希望大家喜欢喵喵!!

AHOI 的大师出的题,果然是相当的规范!我很喜欢哈!好题难得!大家一定要珍惜咩!

嘴巴一个不需要对钥匙数量限制的做法咩。需要使用到根号分治咩。

做法

为了表达方便,我们设每种钥匙数量的最大值为 c 咩。

考虑到此类信息的合并是困难的,抛弃常规的 O(\log n)O(\sqrt{n}) 次合并的做法。使用点分治或启发式合并将最终的路径划成两半咩。

每次询问 (x,y) 变成了 (x,rt)(rt,y) 的过程,考虑这种括号合并的问题在序列上分治的时候是怎么处理的咩:

记录 (x,rt) 的答案及剩下的钥匙数量,记录 (rt,y) 的答案及剩下的胸数量,对于每种颜色,取剩下的钥匙和胸的较小值计入答案即可咩。

那么如此,考虑如何维护两者的较小值。一种比较显然的方法是,直接对于每种颜色算贡献。

但是这样的话复杂度仍然是 O(n^2 \log n) 的咩!

考虑优化,可以使用经典的根号分治套路,设阈值为 B 咩:

## 代码 代码就不放到这里了咩!大家自己咩一咩咩! 咩咩咩咩咩咩咩咩咩咩!咩咩咩咩咩咩咩咩咩咩!咩咩咩咩咩咩咩咩咩咩!咩咩咩咩咩咩咩咩咩咩!咩咩咩咩咩咩咩咩咩咩!咩咩咩咩咩咩咩咩咩咩!