模拟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表示不合法。
记录前趋。
最终找到最优答案,生成一个方案就可以了。
这种打法细节很多。