「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)\)