UNR #6 题解
「UOJ747」面基之路
难得有一道我做得起的水题。
尝试二分答案,判定等价于检查是否存在一个点,使得在规定时间内 hehe 蚤和网友们都可以走到该点。检查能否走到某个结点是容易的,检查某条边上是否存在一个点相当于是检查集合的交集是否为空,转化成区间的并集是否覆盖了整条边,可以将区间排序之后扫描端点。
复杂度为 ,虽然复杂度很高但是跑起来挺快的。如果去掉外层二分也可以,这样的话每个人到边上某一点的时间可以描述为一个凸函数,我们就是要对于凸函数取 之后算最小值。
不过我听说好像有人写这个算法写挂了,那就先不管了吧。
「UOJ748」机器人表演
「UOJ749」稳健型选手
「UOJ750」小火车
一道题让我彻底感受到了自己的愚蠢
等价于求“是否存在两个不同的子集的和 之后相等”。由于我们保证了 ,因此必然存在解。
设 表示子集和 后为 的子集个数。我们要做的就是找出 中某一个 的位置。
主动一点,我们尝试直接二分答案。二分一个上界 ,我们相当于要求 ,如果这个和 ,那么 之中必然存在一个 使得 ,否则就不存在。
Remark.
虽然想到了 ,也想到了要找一个 的位置,但是始终没有想到直接去 上二分。
查找的手段不够熟悉。也被之前见过的类似的题目误导了。
怎么计算 某一位置上的前缀和?结合数据范围,我们可以想到 meet-in-middle。值得注意的是,左右两侧的子集的和可以预先 ,这样两边的子集加起来最多是 ,因此我们只需要考虑子集和落在 和落在 两种情况,双指针扫一扫即可。
找到了 之后,寻找一组解的过程也可以双指针。复杂度即为 。
「UOJ751」神隐
「UOJ752」Border 的第五种求法
20pts 的做法是容易的,60pts 的做法不知所云(Border 的长度结构为人熟知,但是 Border 的出现次数结构我是听都没有听说过)。
Border 的概念是同时作为前缀和后缀的串。后缀在 SAM 上的结构是显然的,就是后缀树链,但是前缀的结构不容易看到。如果单纯从后缀树的角度来看,前缀只能由 来表征,不容易作为判断 Border 的依据。
Note.
如果一定要从后缀树的角度来看的话,我们至少可以得出这样的结论——后缀树链上每一个结点内至多只包含一个 Border。
但是有什么用呢?😢
此时就要用到 SAM 的另一个组成部分 DAWG。前缀通过“逐个加字符”的方式生成,这个生成方式在 DAWG 很容易找到对应的转移路径。
那么,询问 的子串信息时,我们可以在 DAWG 上找出 对应的路径,路径上结点和后缀树链上结点的交集恰好就是 Border 对应的结点集合。我们把这些结点的 的权值加起来就是答案。
为了解决 DAWG 的路径问题,我们对于 DAWG 做剖分,就可以将 DAWG 上结点的集合拆分成 个区间。后缀树链的结构比较好,我们可以做一个 DFS,维护当前树链上的点在 DAWG 剖分上的出现情况,这样就可以直接查和了。
怎么将 拆分成 DAWG 上的路径?每次在一条重链上二分,用 hash 判一下就好了。
复杂度可以做到 。
Remark.
很多时候都忽略了 SAM 的 DAWG,而仅仅用上了后缀树。这样是对于 SAM 的弱化,从 Border 的问题中,我们也能看到后缀树的羸弱无力(毕竟它是后缀树,只有一个“方向”)。
这导致我常常以为 SAM 在处理前缀信息的时候会很吃力。但现在结合了 DAG 剖分之后,DAWG 的结构也能够很好地刻画前缀的信息。这是一个很好的出发点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-08-10 [HNOI2011]卡农
2021-08-10 「题集」精致的袖珍题目-2021 年度