本来应该是 ACC 2
我打析合树?真的假的?要上吗?
A
把异或值二进制分解,根据期望线性性,
而
B
只需要对每个
考虑容斥,设
考虑算
选出
方案数实际上就是把
于是
C
观察到两个性质:
- 相邻两个相同的手势可以只留下一个
- 两个强手势夹一个弱手势,可以只留一个强手势
维护一个手势栈,满足以栈顶为第一个时,对于相邻的两个手势,后一个能赢前一个。
考虑加入一个手势
(特别地,若栈中只有一个手势,
手模一下,可以发现答案就是栈底,也就是最后一次栈中只有一个手势时的这个手势,考虑如何找到这个时刻。
考虑直接不管栈中只有一个手势的情况,
画个图可以发现,此时栈的大小最小的时刻,就是我们要找的时刻。
设
要找栈的大小最小的时刻,就是要找
D
看懂这篇题解不需要提前学会析合树和拉格朗日插值。
考虑魔改析合树。
把连续段的定义改成题面中的定义:
本原段的定义不变:一个连续段是本原段当且仅当没有其他连续段与其部分相交。
那么本原段之间只有包含关系,可以以本原段为点集建出一棵树,这棵树就是析合树。
注意本题中叶子不一定是连续段,但是为了方便不妨把
合点和析点的定义不变:
- 一个点是合点当且仅当任取其连续的若干个儿子,都可以组成连续段。
- 一个点是析点当且仅当任取其连续的若干个儿子,都不能组成连续段。
的叶子是析点。
反证法可证一个点要么是合点,要么是析点,要么是非法叶子。称一个点是合法点当且仅当它是合点或析点。
考虑本题中合点,析点下方可以连接什么儿子。
合点的儿子一定是析点,否则若合点
析点的儿子类型没有要求,但它们中第一个合法点之前、相邻两个合法点之间、最后一个合法点之后都至少有一个非法叶子,
否则就可以形成新的本原段。
在 DP 之前,还有一个支线问题:确定了某析点的儿子中的合法点后,还需要填入
设方案数为
考虑递推
-
加入
前只有 是连续段(儿子中没有合法点):对于加入 前排列的每一位 ,都可以令 来加入 (相当于在置换环的一条边上加了一个点),则对于每种排列有 种加入 的方法,方案数 。 -
加入
前不只 是连续段(儿子中有一个合法点):设这个合法点的长度为 。根据上文,这个合法点最靠左可以取到 ,最靠右可以取到 ,有 种取法,要求加入 后合法点内没有连续段,即要求加入 后合法点内每个加入 前的连续段都过 ,实际上就是要求长度为 且每个连续段都过最大值的排列个数,在逆排列上考虑,发现就是要求长度为 且只有 是连续段的排列个数,即 ,剩下 个非法叶子有 种填法,所以合法点的长度为 时有 种方案,总方案数 。
(感谢 jijidawang)
于是
考虑 DP,设
转移类似区间 DP,按区间长度从小到大枚举
考虑
所以转移时使那些不该成为连续段的区间不能成为合点的连续的若干个儿子和析点即可。
但这样复杂度是
以下设
具体地,设答案函数
则只需要求出
考虑
在最外面枚举
考虑得到了
首先可以构造
对于每个
设
解方程得:
这样就可以递推
总复杂度瓶颈在之前的 DP,总复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具