Atcoder Grand Contest 041 F - Histogram Rooks
考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为 。把与 中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是 ,乘以 并求和即可。
这个做法直接优化显然不行。我们考虑设 中的点所在的列组成的不可重集为 ,我们枚举 是什么,那么考虑每一个行连续段计算方案数,分两种情况讨论:
- 这一行里没有任何属于 的格子,那么设 为这一行中不属于 的列的个数,那么这种方案的容斥系数乘以方案数就是 。
- 这一行有至少一个格子属于 ,那么枚举这一行中属于 的格子的数量 ,容斥系数 ,方案数 ,把它们求和可以得到 ,其值为 。
两者加起来就是这一行的方案数。
但是这个做法有一个问题,就是我们不能保证 中每一列都有至少一个格子属于 。
考虑再进行一层容斥。枚举集合 满足 且 中的列都没有属于 的格子,那容斥系数自然是 ,这样每一行的方案数也要进行相应的改变:
- 这一行里没有任何属于 的格子,那么设 为这一行中不属于 的列的个数,那么这种方案的容斥系数乘以方案数就是 。
- 这一行有至少一个格子属于 ,设 为这一行中属于 但不属于 的列的个数,那么类比之前的过程可知方案数为 。
而我们发现,这个棋盘实际上可以被看作笛卡尔树的形状。即,对于每一个行连续段,它对应的列实际上是笛卡尔树上一个区间。因此考虑对 建笛卡尔树,然后设 表示 子树内有 个属于 的列,是/否有属于 但不属于列的所有 的方案数乘以容斥系数之和。转移是背包合并,总复杂度就是 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-02-10 2022.2.8 模拟赛题解
2022-02-10 Codeforces 309E - Sheep(二分+贪心)
2022-02-10 洛谷 P5548 - [BJ United Round #3] 押韵(单位根反演+幂级数)
2021-02-10 数论学习笔记
2021-02-10 洛谷 P7323 - [WC2021] 括号路径(启发式合并)