模拟37 题解

A. 简单的区间

看到这种题,一眼就是枚举最值,则确定左右区间,统计跨最值点的答案。

维护前缀和后缀和就完了。

于是自然地想到用个主席树,还是枚举小的区间,复杂度$O(nlog^2n)$。

正确的算法一定无法避免枚举小区间,已经带了一个log,

O(1)查询,估计得用桶。

所以算法流程是:

先$solve(轻儿子)$,

回来把桶整个清空。

接着$solve(重儿子)$,

接着枚举轻儿子,在桶里找贡献累加。

接着再枚举轻儿子,维护好整个桶。

 

 

 

B. 简单的玄学

设$dp(i,0)$表示已经选择了i次,还没有重复的方案数。

$dp(i,1)$表示已经选择了i次,已经有至少一个重复的方案数。

显然$dp(i,0)=dp(i-1,0)*(2^n-i+1)$

$dp(i,1)=dp(i-1,1)*2^n+dp(i-1,0)*(i-1)$

最终答案就是$\frac{dp(m,1)}{2^{nm}}$。

上面那个东西是不太好做的,因为复杂度不对劲而且不方便约分。

发现$dp(m,0)+dp(m,1)=2^{nm}$

$dp(m,0)=\frac{2^{nm}!}{(2^{nm}-m)!}$

只要算出$\frac{dp(m,0)}{2^{nm}}$,再一减就可以了。

在取模的意义下约分是很困难的。

但是本题保证分母质因子只有2,只要提出分子中的2就可以了。

发现显然$(2^n-i)$中质因子2的个数与$i$相同,于是问题又转化成了求阶乘中质因子2的个数。

不断给阶乘的最大项>>1,求和就行了。

理由是分别统计$2^i$的倍数。

 

 

 

C. 简单的填数

一道贪心题,被我打成了dp

设dp(i,j)表示第i个受限制的点,前面已经连续了j个与它相同的数。

值为1表示合法,0表示不合法。

记录前趋。

最终找到最优答案,生成一个方案就可以了。

这种打法细节很多。

posted @ 2019-09-06 08:03  skyh  阅读(217)  评论(0编辑  收藏  举报