Excavations

作者:孙奕灿

关键词: DP,暴力,生成函数.

问题简述

个建筑,第 个建筑的深度是 , 种类是 , 你有一个探测器,只能尝试探测 个建筑,且每个建筑只能尝试探测一次,深度不超过 的建筑会被成功探测到,否则不会.

你忘记了 的值,但是你记得你成功探测到的建筑的种类集合 .

现在你需要计算有多少个 元组使得存在一个 满足探测这些建筑会符合你记得的探测结果.

数据范围

算法一

考虑一个 元组合法的条件,用 表示这个 元组中第 种建筑的最浅的深度.那么合法的条件就是:

于是可以枚举这个 元组然后暴搜.

时间复杂度 .

算法二

一个很直观的想法就是枚举 ,然后对于第 种建筑,其深度超过 的部分是可以随便选的,我们只需记录这一部分的数量然后用组合数计算答案就好了。

然后就可以 了。首先枚举没出现在 中的建筑的深度最小值,然后用 表示前 种有 个建筑已经随便选了的方案数。把第种建筑的深度从大到小排序,枚举第 种建筑选了第 大(当然它的深度须严格小于)的建筑然后从 转移过来就好了。最后只需使用组合数算答案就好了。

时间复杂度 .

算法三

我们依然在最外面枚举,考虑上一个算法的转移过程.

.

会发现算法一中转移时的值是一个后缀,根据方程,有:

其中分别表示每次转移的区间.把后面的和式写成的形式.那么最后的生成函数就是,其中表示集合的大小,表示选择
以后随便选的不属于的建筑个数.

把上面的分子背包一下,下面的分母展开后是组合数.把两者卷积之后就可以得到结果了.

于是我们可以在的时间内解决一次枚举的计算,时间复杂度.

算法四

再继续分析,发现分母是不变的,需要维护的只是分子.我们能不能一边枚举,一边维护分子的多项式呢?答案是可以的.

把所有的建筑拎出来按深度从小到大排序,然后从前往后扫,如果扫到一个不在中的建筑就算一下,否则我们会发现分子的多项式只有一个因子会改变,使用多项式乘除法来维护分子即可.因为每次乘除的多项式都是的形式,所以可以完成一次乘除.

至于具体实现乘除,乘法是比较好做的,除法只需把
展开成
,发现乘这个多项式相当于做无限背包.

时间复杂度.

results matching ""

    No results matching ""