P6630 [ZJOI2020] 传统艺能 题解
P6630 [ZJOI2020] 传统艺能 题解
巧妙的状态设计。
首先根据期望线性对线段树上每个节点考虑最后被覆盖的概率。
设这个节点为 \([L_x,R_x]\),其父亲节点的区间为 \([L_f,R_f]\),考虑一次区间操作 \([l,r]\) 可能对这个节点造成的影响。
- \([L_f,R_f]\subseteq [l,r]\):覆盖了父亲,那肯定跟 \([L_x,R_x]\) 没有关系,\(tag_x\) 不会变化。
- \([L_x,R_x]\subseteq [l,r]\land [L_f,R_f]\not \subseteq[l,r]\):包含自己但是不包含父亲, \(tag_x\)一定变为 \(1\)。
- \([L_x,R_x]\cap [l,r]=\emptyset\land [L_f,R_f]\cap[l,r]\ne\emptyset\):父亲会下放 \(tag\),此时 \(tag_x\) 会变成自己及所有祖先的 \(tag\) 的并。
- \([L_x,R_x]\not\subseteq [l,r]\land [L_f,R_f]\cap[l,r]\ne\emptyset\):自己的 \(tag_x\) 会被下放此时 \(tag_x=0\)。
- \([L_f,R_f]\cap[l,r]=\emptyset\):与父亲无交集,对 \(tag_x\)不影响。
可以证明只有上述 \(5\) 种情况,发现第 \(3\) 种情况需要知道上一次所有祖先的 \(tag\) 状态,于是朴素的想到将所有 \(n\) 个节点的状态存成一个 \(n\) 维向量,用一个 \(n\times n\) 的矩阵结合矩阵快速幂解决,复杂度 \(\mathcal O(n^3\log k)\)。不能接受。
巧妙的设计:由于仅关注祖先的 \(tag\) 并,我们可以额外存一枚状态来表示。
具体的,设 \(f_{a\in \{0,1\},b\in \{0,1\}}\) 表示祖先的 \(tag\) 并为 \(a\),\(tag_x=b\) 的概率。
设上面 \(5\) 状态的概率分别为 \(A,B,C,D,E\),那么一次转移可以写作:
\[\begin{aligned}
&f_{0,0}\gets Cf_{0,0}+D(f_{1,0}+f_{1,1}+f_{0,1}+f_{0,0})+Ef_{0,0}\\
&f_{0,1}\gets B(f_{1,0}+f_{1,1}+f_{0,1}+f_{0,0})+C(f_{1,0}+f_{1,1}+f_{0,1})+Ef_{0,1}\\
&f_{1,0}\gets A(f_{0,0}+f_{1,0})+Ef_{1,0}\\
&f_{1,1}\gets A(f_{0,1}+f_{1,1})+Ef_{1,1}
\end{aligned}
\]
然后最终的答案就是 \(f_{0,1}+f_{1,1}\),可以设 \(f_0=f_{0,0},f_1=f_{1,0},f_2=f_{0,1}+f_{1,1}\),这样即可将转移写作:
\[\begin{bmatrix}
C+D+E&D&D\\A&A+E&0\\B&B+C&A+B+C+E
\end{bmatrix}
\]
对每个点矩阵快速幂即可。
注意特判区间 \([1,n]\),它的状态仅取决于最后一次操作。

浙公网安备 33010602011771号