「GDOI2020模拟赛day2」我的朋友们

「GDOI2020模拟赛day2」我的朋友们

默认翻转了 \(a_i\) 顺序,下文多项式省略 \((x)\)

设当前区间为 \((i-L,i]\) 到最终结束的期望步数为 \(dp_i\)

\(A_i=a_ix+1-a_i\)

\(P_i=\prod_{j\in(i-L,i]}A_j\)

\(F_i=\sum_{j=1}^i dp_jx^j\)

\(\displaystyle G_i=F_{i-1}P_i,dp_i=\frac{[x^i]G_i}{coef_i}\)

其中常数 \(coef_i=1-[x^0]P_i=1-\prod_{j\in(i-L,i]}(1-a_j)\) ,容易预处理得到

用分治 \(\text{NTT}\) ,过程中维护

\(P_{l,r}=\prod_{j\in(r-L,l]}A_j\)

\(\displaystyle G_{l,r}=F_{l-1}P_{l,r}\)

显然 \(G_{i,i}=G_i\)

分治转移如下:

\(\displaystyle G_{l,mid}=G_{l,r}\prod_{j\in (mid-L,min(l,r-L)]} A_j\)

\(P_{l,mid}=P_{l,r}\prod_{j\in (mid-L,min(l,r-L)]} A_j\)

先求出 \(G_{l,mid}\)

\(P_{mid+1,r}=P_{l,r}\prod_{j\in (max(r-L,l),mid+1]} A_j\)

\(\displaystyle G_{mid+1,r}=(G_{l,r}+(F_{mid}-F_{l-1})P_{l,r})\prod_{j\in (max(r-L,l),mid+1]} A_j\)

归纳上述过程,发现实际上同步维护的部分只需要维护

\(G_{l,r}\)\([l-(r-l),r]\) 项, \(P_{l,r}\)\([0,r-l]\)

只需要实现

通过 \(G_{l,r}\)\([l-(r-l),r]\) 项得到 \(G_{l,mid}\)\([l-(mid-l),mid]\) ,以及 \(G_{mid+1,r}\)\([l,r]\)

通过 \(P_{l,r}\)\([0,r-l]\) 得到 \(P_{l,mid}\)\([0,mid-l]\)\(P_{mid+1,r}\)\([0,r-mid-1]\)

初始状态

\(P_{L,n}=\prod_{j\in(n-L,L]}A_j\)

\(G_{L,n}=0\)

在分治过程中有非常多的 \(P_{l,r}\) 都是空的。。

可以分治 \(\text{NTT}\) 预处理出转移系数 \(\displaystyle \prod_{i=l}^r A_i\) ,或者用记忆化暴力求出,复杂度为 \(O(n\log ^2n)\)

在转移过程中维护的部分长度与 \(r-l\) 同阶,因此复杂度为 \(O(n\log^2 n)\)