BalticOI 选做
BalticOI 选做
[BalticOI 2024]Wall
这种做法题解区好像没有,所以讲一下,比较有意思。
答案可以用
先考虑
重点在于
对于
故这种情况的贡献就是
类似于
这种情况的贡献是
我们发现
对于这种二元组统计问题,可以想到使用分治结构去计算。我们考虑线段树。
看看答案怎么合并,一个节点的合法二元组由两个儿子内的答案和跨越分治中心的区间
表示区间内所有合法二元组的贡献和。 表示区间内所有合法的前缀 的贡献和。 表示区间内所有合法的后缀 的贡献和。
先考虑
最为简单的就是
记录的信息类似于 。 记录的信息类似于 。
事实上,我们需要计算的答案形式与
我们只需要额外维护
记录的信息类似于 。 记录的信息类似于 。
那么就有
接下来考虑
考虑
最后答案就是
这么计算的好处在于分治结构可以动态。那么我们让
时间复杂度
[BalticOI 2021] The short shank
提供一个比较好想的做法.
考虑如果一个隔板都不放,那么每一个犯人有两种造反的可能性:
- 自己造反的时间的时间
.(一类犯人) - 自己造反的时间虽然大于
,但是存在一个位于其之前的犯人满足 ,并且可以通过传导的方式使得这位犯人在 之前造反.(二类犯人)
对于一类犯人,没救了.但是可以通过插入隔板的方式阻断第一类犯人造反后的传导,以减少第二类犯人的造反.接下来需要集中注意力:
性质1:假设对于一个二类犯人 ,可以通过传导的方式使得其造反的,编号最大的犯人为 .则当 到 之间存在隔板的时候,犯人 不会造反.
这个就不需要证明了,应该是比较显然的.所以我们就提取出了若干个区间
但是这样也不是很好做,我们猜想区间是否存在一些性质:
性质2:对于两个二类犯人 , 要么包含,要么不相交.
证明:就是证明不会出现
我们获得了这个重要性质,像一下,区间要么不相交,要么包含.容易想到树形结构.我们考虑对于一个区间,让最小的,包含其的区间向他连边,就得到了一个森林.
问题进一步被转化为选出若干个节点,使得他们到根的路径并尽可能的大.这个问题十分经典,长链剖分选前
时间复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?