Solution Set -「OurOJ Contest #2587」浅写
「OurOJ #47030」_
Link & Submission & Tags:「A.DP-计数 DP」「A.数学-Stirling 数/反演」「B.Tricks」
我们习惯于用组合数拆形如 的贡献,可惜 的复杂度不被允许。我们需要找到更优秀的贡献拆分方法。
关于幂,可以想到 Stirling 反演。考虑
其中 看上去并不好维护,但是它有一个很简单的组合意义:从走过的 条边里有序地选出 条的方案数。除一个 ,那就是 ,即无序地选出 条边的方案数。我们对这个计数问题暴力 DP,令 表示从 走到 ,已经在路径上选了 条边的方案数。 转移就行。
「OurOJ #47031」__
Link & Submission & Tag:「A.数据结构-树套树」
“至少出现一次”,可以尝试直接不重不漏地进行加法贡献。那么当 的颜色变为 时,所有 的祖先中,子树内以前没有 颜色的结点都会受 贡献;当 的颜色从 改变时亦有类似讨论。用 set 维护一下每种颜色出现的 DFN,可以倍增求出最高的满足要求的 的祖先 。
然后呢?BIT 套线段树差分维护“ 到 的数量上每个点答案的 位置 ”,,不卡常。
「OurOJ #47031」___ *
Link & Submission & Tags:「A.DP-状压/插头 DP」「C.性质/结论」
条件的转化很关键,不要一味按照题目描述的顺序思考,例如本题,可以想想,如果先把所有权值随机出来,我们能得到多少种点分树?
——只有唯一一棵!每次分治区域内的最小值位置需保证唯一,这个点就是当前分治中心,依此递归构造,一种点权方案要不非法,要不只能由一种点分树生成。
进一步,怎样才能保证最小值位置唯一?——对于任意两个权值相同的结点,它们的树上路径中必须存在权值更小的结点。可见这是合法的充要条件。
接下来的求解就平凡了。令 表示 子树内,能从对应点出发,仅经过权值不小于自己的结点,走到 以上的权值集合为 ,暴力转移可做到 。
然后,如你所见,极其卡常。给一些我加的优化叭。
实现层面,不要用任何辅助数组。注意贡献形式是,当 且 的最高 bit 不在 中时,。从大到小枚举 ,同步在 上滚类似后缀和的东西即可。
卡常技巧:
-
指针存一下二维状态的第一维,保证瓶颈处只有一维数组访问;
-
虽然不知道效果明不明显,也不知道科不科学:DP 的第二维不要恰好开成 ,这样很浪费 cache line;
-
#pragma GCC optimize("Ofast") #pragma GCC target("avx, avx2, mmx, sse, sse2, sse3, sse4, ssse3")
最后,值得一提的是, 的转移可以表示为一定条件下的集合卷积,至少可以无脑优化至 ,理论层面比较优秀,但是算出来巨大,标算没采用这种做法可以理解。另一方面,完整的贡献形式并不是位运算卷积,所以可能很难用类 FWT 的思路取得更好优化效果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现