模拟82 题解

A. D2T1

因为最终答案只需要大小为$n$的排列的返回值的期望。

我们并不关注排列内部的内容。

所以不妨设长度为$n$的排列的返回值的期望为$f_n$,长度为$n$的排列的逆序对个数为$g_n$。

那么有$f_n=\frac{\sum \limits_{i=0}^{n}\binom{n}{i}*f_i}{2^n}+g_n$。

显然随机排列中正序对和逆序对个数应当是相同的,并且二者相加为$\frac{n*(n-1)}{2}$,故$g_n=\frac{n*(n-1)}{4}$。

然而受到$D1T2$的启发,我们应当也可以想到$g_n$的另一个求法。

考虑从大到小插入每一个数。

那么插入第$i$个数的贡献为$\frac{\sum \limits_{j=0}^{i-1}j}{i}$,分别表示插入到第$j$个空位造成的逆序对贡献。

由此我们是可以推出上式的。

于是我们可以$O(n^2)$解出$f_n$,对$f_n$作前缀和后除$n$即为$ans_n$。

显然有了这个算法后,我们应当打表。

然后就会发现$f_n$这个函数就非常好,对它邻项作差一次立刻变成了等差数列。

也就是说它必是二次函数,所以$f_n$的前缀和必为三次函数。

所以设$s_n$为$f_n$的前缀和,$s_n=a*x^3+b*x^2+c*x+d$。

分别代入$x=1,2,3,4$,可以解出$a,b,c,d$,除$n$之后我们就得到了答案。

$AC$之后重新看题,考虑式子的实际含义。

不妨考虑每个逆序对,设它的贡献为$x$。

那么有$x=\frac{1}{4}*x+1$,可解得$x=\frac{4}{3}$。

由逆序对的期望个数$\frac{n*(n-1)}{4}$,二者相乘可得$f_n=\frac{n*(n-1)}{3}$。

用自然数幂和公式求和可得到我们刚才暴力消元解出的答案。

B. D2T2

看完题并没有思路,只会大力枚举,用哈希表骗分。

正解要枚举后缀与前缀之间的断点,这个做法确实巧妙多了。

用$trie$树暴力匹配,复杂度就做到$O(n*len)$了。

正解的做法更加巧妙一些:

首先建前后缀共两棵$trie$树,$trie$树上的节点$sz$对前缀求和。

将两棵$trie$树上节点对应的哈希值分别插入哈希表中,映射到对应的前缀求和后的$sz$。

之后可以对原字符序列进行二分,通过哈希表中能否查询到值$check$,求出最靠左的左端点和最靠右的右端点。

二者相乘是该断点贡献的答案。

C. D2T3

部分分似乎确实在提示,要满足题中的要求,会存在一些特殊性质。

当$k$比较小的时候,答案可以大力分类讨论。

当$k$比较大,答案一定只表现为一种情况:$k$个皇后在同一线上。

题中的模数比较小,所以可以用$lucas$定理搞。

为了求和一些奇怪的式子,我们还需要大力拆式子,用自然数幂和讨论。

猜你喜欢

转载自www.cnblogs.com/skyh/p/11722492.html