题解 P7986 [USACO21DEC] HILO P

· · 题解

题目难度:USACO P/省选-

不难发现猜 HI 的数不会使猜 LO 的数被跳过。设 y=N-x ,那么原题相当于将 a_1,a_2,\dots,a_xb_1,b_2,\cdots,b_y 排列,只记录 a,b 的每次下标最大值的出现位置,求期望 ba 的数量。

这可以 dp ,设 dp[i][j][0/1] 为当前最大出现 a_i,b_j 以及最后一个出现的是 a/b ,通过简单的转移可以做到 O(N^3) 。前缀和优化可以做到 O(N^2) ,这里不再赘述。

比较吸引我的是在赛后讨论中看到的 O(N) 做法,这里简单的证明一下。

结论:令 H_0=0,H_N=1+\frac{1}{2}+\cdots+\frac{1}{N} . 有

E[\#(ba)]=\frac{1}{2}(H_x+H_y-H_N+\frac{y}{N})\\

证明:

$$ \Delta=\frac12(\frac1{y+1}-\frac{1}{N+1}+\frac{y+1}{N+1}-\frac{y}{N})=\frac{1}{2(y+1)}-\frac{y}{2N(N+1)} $$ 计算对 $a_1a_2\dots a_xb_2b_3\dots b_y$ 的排列中插入 $b_1$ 对答案的贡献, $b_1$ 只能排在第一个出现的 $b$ 之前,否则会被跳过。$y$ 个 $b$ 将 $x$ 个 $a$ 分成 $y+1$ 段,故第一个 $b$ 前 $a$ 的期望个数为 $\frac{x}{y+1}$ 个。设前面有 $k$ 个 $a$ 。 接下来,只要 $b_1$ 被插入在 $k$ 个 $a$ 中最大的 $a$ 前面,都会对期望贡献一个 "ba" 。最大的 $a$ 的期望位置为: $$ E[index]=\left\{\begin{matrix} \frac{k+1}2,\qquad k>0\\ 0,\qquad k=0\\ \end{matrix}\right. $$ $k=0$ 即为原排列首项是 $b$ 的概率,为 $\frac{y}{N}$ 。 能得出: $$ \Delta = \frac{1}{N+1}(\frac{1}{2}\times(\frac{x}{y+1}+1)-\frac{y}{N}\times\frac{0+1}{2})\\ =\frac{1}{2(y+1)}-\frac{y}{2N(N+1)} $$ ```cpp const int N=2e5+5,P=1e9+7; int n,x; ll H[N],inv[N]; int main(){ n=read(),x=read(); inv[1]=1; ll fac = 1; rep(i,2,n){ inv[i]=(P-P/i)*inv[P%i]%P; fac = fac*i%P; } rep(i,1,n)H[i]=(H[i-1]+inv[i])%P; int y = n-x; cout<<(fac*inv[2]%P*(inv[n]*y%P+H[x]+H[y]-H[n])%P+P)%P; return 0; } ```