2025.4.6 模拟赛

4.6 模拟赛

过于困难的一场/kk

又是不会 dp 的一场/kk

获得了 20+15+24=59 的好成绩(笑)

information

一个经典的转化:\(E(t)=\sum P(t>x)\)

考虑固定 \(x\),如何计算 \(P(x)\)

要求 \(x\) 次没有结束,即 x 次后还有一些位置没被覆盖。

考虑每一次钦定的点在最终局面上的样子,第 \(i\) 次钦定最终就是长为 \(2(x-i)+1\) 的段。

考虑最终局面是若干长为 \(a_1,a_2\dots a_k\) 的极长段(认为一个极长段是形如 xxxxxo,其中 o 是空位置),所有的钦定段必须完全被这些极长段包含,则极长段 \(j\) 会给第 \(i\) 次钦定贡献 \(max(a_j-(2(x-i)+1),0)\) 种初始位置。

这个 max 是不好的,考虑按极长段的长度 dp,在计算到长为 \(2(x-i)+1\) 的段时计算贡献,这样就不需要考虑 \(<0\) 了。

具体的,设 \(f(i,j,k)\) 表示考虑到 \(>i\) 的段,当前一共有 \(j\) 个段,总长度为 \(k\)
\(f(i-1,j+l,k+li)\leftarrow f(i,j,k)\),且对于偶数的 \(i\)\(f(i,j,k)\leftarrow f(i,j,k)\times (k-ij)\)

先暂且这样 dp,考虑计算把这些段放到环上的方案数。
不妨认为 \(a_i\) 两两不同,出现次数是 \(b_i\)
枚举第一个段 \(a_i\),这个段有 \(a_i\) 种位置(考虑环上原点在段上的位置),其他段只考虑排列方式。
故是 \(\sum \frac{a_i (\sum b_i-1)!}{\Pi(b_j-[j=i])!}\) ,拆开是 \(\frac{\sum a_ib_i}{\sum b_i}\times \frac{(\sum b_i)!}{\Pi b_i!}\)。其中 \(\frac{1}{\Pi b_i!}\) 可以直接在dp 中乘 \(\frac{1}{l!}\)\(\sum b_i\) 就是 \(j\)\(\sum a_ib_i\) 就是 \(n\),容易计算。

这里还需要一个容斥,因为我们钦定了某个集合不能被覆盖,但集合外(段内)的元素也可以不被覆盖,于是这里会算重一些东西,容斥系数是 \((-1)^{j+1}\)

现在复杂度瓶颈是 枚举 \(x\) 然后 \(O(n^3)\) dp,整体是 \(O(n^4)\)。但是这个枚举 \(x\) 其实很容易去掉。

考虑 \(x\) 对 dp 过程的影响,其实就是从 \(i=2x-2\) 开始需要乘一个系数,那么我们直接多记一维 \(0/1\) 表示是否乘了系数,从 \(0\to 1\) 的时候乘上 \(x\) 的贡献即可。

最后的转移式子:

// ivpw[i]=n^(-i)
for(int l=0;l*(i+1)+k<=n;l++){
    int val=mul(f[q][j][k][o],ivf[l]);
    f[p][j+l][k+l*(i+1)][o]=pls(f[p][j+l][k+l*(i+1)][o],val);
    if(!o && !p) f[p][j+l][k+l*(i+1)][1]=pls(f[p][j+l][k+l*(i+1)][1],mul(val,ivpw[i/2+1]));
}
//.........
for(int j=0;j*(i+1)<=n;j++) rep(k,j*(i+1),n) 
    f[p][j][k][1]=mul(f[p][j][k][1],k-(i+1)*j);

正解是对整个过程进行 dp,考虑段的合并。

\(f(i,j)\) 表示当前总长 \(i\) ,有 \(j\) 个极长段,这种情况的概率。
相应的,\(g(i,j)\) 表示达成这种情况所需时间的期望。

考虑每一轮发生的事情,分成 向左扩展,向右扩展,新加一个点。

向左/右扩展可能会造成一些段的合并,\(f(i+j,k)\leftarrow f(i,j)S(j,k)\),其中 \(S(j,k)\) 表示将 \(j\) 个点分成 \(k\) 组,排列的方案数,即 \(\sum \Pi |S_i|!\)

\(S(j,k)\) 可以用类似斯特林数的方法递推。

新加一个点可能有 \(4\) 种情况:

  1. 原来已经被覆盖的,啥也没变
  2. 把一个段延长
  3. 合并两个段
  4. 自成一段

这里我们不需要考虑新加点的位置,因为这个位置在 \(S(j,k)\) 中被确定了。

三对 dp 数组循环维护,期望就是 \(g(i,j)+f(i,j)\to g(i,j)\),就相当于是多了一轮。

major

这题实在是太难了/kk
瞪了好久才明白...数学太不好了/kk

显然的是,对于一个点 \(u\)\(f_u=\sum\limits_{i\ge\frac{d_u}{2}+1}[x^i]\Pi(1-f_v+f_vx)\)

考场上到这就不会了...因为不会多项式算法...甚至不知道分治 NTT 算这个东西可以 \(O(n\log^2 n)\) /kk

修改一个权值是不好的,这样需要多项式除法,于是对询问线段树分治,把权值区间挂在节点上,每个节点维护 \(f\) 值。

考虑对点 \(u\) 及其儿子的线段树进行合并。
维护 merge 函数,同时合并 \(cnt\) 个节点。传入一个参数多项式 \(P(x)\) ,其中 \(x^i\) 表示已经确定了一些点的取值,有 \(p_i\) 的概率,还需要至少 \(i\)1,点 \(u\) 就能变成 1 了。

初始值 \(P(x)=x^{\frac{d_i}{2}+1}\),表示还需要至少 \(\frac{d_i}{2}+1\)1 才能让 \(u\) 变成 1

首先把所有叶子节点对应的 \(f_i\) 多项式乘起来,以后的合并不需要建这些节点的儿子,保证了复杂度。

然后把这个多项式 reverse,得到 \(G(x)=g_{l}+g_{l-1}x+\dots+g_0x^{l}\)\(G(x)P(x)=\sum (\sum p_jg_{l-(i-j)})x^i\),因为我们已经确定了 \(l\) 个点,于是把这个多项式除以 \(x^l\),前面 \(x^0\dots x^{l-1}\) 项的系数都加到 \(x^l\) 项上,表示之前确定的点已经可以让 \(u\) 变成 1 了,剩下的怎么选都无所谓了。这样我们得到的多项式 \(H(x)=\sum (\sum p_jg_{j-i})x^i\),非常合理的表示了“本来还需要 \(j\)1,新确定的叶子里有 \(j-i\)1,后面还需要 \(i\)1”(这个写法不太严谨,\(x^0\) 项按照前面的描述需要特殊计算)。

当我们合并到叶子节点,当前的多项式 \(P(x)=f_0+f_1x\),答案就应该是 \(w_u\times f_1+f_0\)。于是我们需要维护一个二元的乘加 tag。

dfs 一遍,一路合并上去,最后遍历根的线段树输出答案即可。复杂度 \(O(n\log^3 n)\)

posted @ 2025-04-17 20:00  Cindy_Li  阅读(42)  评论(0)    收藏  举报