UOJ424 [集训队作业2018] count
将序列对应到笛卡尔树,发现每棵笛卡尔树只对应一种合法序列。因为在笛卡尔树上往左走其对应的数至少减 ,往右走不一定减 ,所以这棵笛卡尔树从根节点往左走的次数要 ,题目就转化为了统计有多少棵 个节点的合法笛卡尔树。
笛卡尔树是二叉树,因为二叉树和括号序列都可以用卡特兰数计数,所以笛卡尔树能转化为括号序列。考虑中序遍历,每往左走就加入一个左括号,回溯回来时加入一个右括号,往右走时不操作,到叶子节点时加入一对完整括号,那么其就对应到了一个 的括号序列。
设 为位置 之前左括号个数减右括号个数,得其需要满足 。将其进一步转化为网格图上路径计数,即从 走到 ,只能向上向右走,且不能碰到直线 的方案数。
考虑翻折法来容斥计数,将连续碰到一条直线看作只碰到一次,如 看作 ,也就是只考虑第一次碰到直线的贡献。不合法方案形如:
考虑要减去以 开头的方案数,就减去以 结尾的方案数,加上以 结尾的方案数,一直这样下去,直到方案数为 。这一过程可以看作将终点 沿 翻折,减去从 到终点不受限制的方案数,再沿 翻折,加上从 到终点不受限制的方案数,直到终点 超出边界。减去以 开头的方案数同理。
为两直线间的距离,得复杂度为 。
还有另一种做法,设 为 个节点往左走的次数 的笛卡尔树个数,得:
其生成函数为 ,得:
设 ,得:
得 ,可以用矩阵快速幂求出 ,这里先用点值表示后再进行快速幂即可。
复杂度为 ,明显没有第一种方法优秀。
__EOF__
本文作者:lhm_
本文链接:https://www.cnblogs.com/lhm-/p/13823293.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
本文链接:https://www.cnblogs.com/lhm-/p/13823293.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)