2022.9 做题记录

P3205 [HNOI2010] 合唱队

fl,r,0f_{l,r,0} 表示区间 [l,r][l,r] 内为理想队列且最后一个人由左边进入的方案数.

fl,r,1f_{l,r,1} 表示区间 [l,r][l,r] 内为理想队列且最后一个人由右边进入的方案数.

fx,x,0=1f_{x,x,0}=1aia_i 表示原序列的第 ii 个元素.

fl,r,0=[al<al+1]fl+1,r,0+[al<ar]fl+1,r,1f_{l,r,0}=[a_l<a_{l+1}]f_{l+1,r,0}+[a_l<a_{r}]f_{l+1,r,1}

fl,r,1=[al<ar]fl,r1,0+[ar1<ar]fl,r1,1f_{l,r,1}=[a_l<a_r]f_{l,r-1,0}+[a_{r-1}<a_r]f_{l,r-1,1}

P1613 跑路

fu,v,kf_{u,v,k} 表示图中存在一条 uvu\rightarrow v 的路径,使得路径长为 2k2^k

转移考虑 floyd 传递闭包的过程,枚举断点 pp,如果 fu,p,k1f_{u,p,k-1}fp,v,k1f_{p,v,k-1} 均为真,则 fu,v,kf_{u,v,k} 为真.

每次转移成功都在图中连一条 uvu\rightarrow v 的边,最后在图上求 1n1\rightarrow n 的最短路即可.

P1397 [NOI2013] 矩阵游戏

注意到题目中给的递推式均为常系数齐次线性递推,考虑矩阵快速幂.

记第 11 个递推式对应的转移矩阵为 AA,第 22 个递推式对应的转移矩阵为 BB,初始矩阵为 SS

容易得到:

S=(11),A=(a0b1),B=(c0d1)S= \begin{pmatrix} 1 \\ 1 \end{pmatrix} , A= \begin{pmatrix} a & 0\\ b & 1 \end{pmatrix} , B= \begin{pmatrix} c & 0\\ d & 1 \end{pmatrix}

最后答案矩阵 TT 由下式计算:

T=S(Am1B)n1Am1T=S(A^{m-1}B)^{n-1}A^{m-1}

T1,1T_{1,1} 即为答案.

注意到 n,mn,m 较大,我们有费马小定理:

xp11 (mod p)x^{p-1}\equiv 1\ (\bmod\ p)

在本题中 p=109+7p=10^9+7

读入时将 n,mn,mp1p-1 即可.

注意对于转移矩阵,当 a=1a=1c=1c=1 时,费马小定理不适用,应对指数模 pp

P3047 [USACO12FEB] Nearby Cows G

钦定根为 11

VxV_x 表示编号为 xx 的节点的点权,CuC_u 表示 uu 的儿子所构成的集合,FuF_u 表示节点 uu 的父亲.

fu,kf_{u,k} 表示在以 uu 为根的子树中深度不超过 kk 的节点权值和,gu,kg_{u,k} 表示在树中与 uu 的距离不超过 kk 的节点权值和.

容易得出 ff 的转移:

fu,k=Vu+vCufv,k1f_{u,k}=V_u+\sum_{v\in C_u}f_{v,k-1}

考虑 gg 的转移.对于 11 个点 uugu,kg_{u,k}22 部分组成:

  1. uu 为根的子树内深度不超过 kk 的节点权值和.
  2. uu 上方且与 uu 的距离不超过 kk 的节点权值和.

我们可以得出 gu,kg_{u,k} 的转移:

gu,k=fu,k+gFu,k1fu,k2g_{u,k}=f_{u,k}+g_{F_u,k-1}-f_{u,k-2}

其中 fu,kf_{u,k} 为第 11 部分,gFu,k1fu,k2g_{F_u,k-1}-f_{u,k-2} 为第 22 部分.

P4290 [HAOI2008] 玩具取名

约定 W\texttt{W} 为第 11 种字符,I\texttt{I} 为第 22 种字符,N\texttt{N} 为第 33 种字符,G\texttt{G} 为第 44 种字符.

ci,j,kc_{i,j,k} 表示第 ii 种字符可以转变成的串的第 kk 个字符,其中 i[1,4],k[1,2]i\in[1,4],k\in[1,2]

fl,r,xf_{l,r,x} 表示目标串在 lrl\sim r 内能够由单个第 xx 种字符转化而成.

转移时枚举转移断点 kk,字符种类 ii,要替换的字符串 jj.转移如下:

fl,r,i=fl,k,ri,j,0fk+1,r,ri,j,1f_{l,r,i}=f_{l,k,r_{i,j,0}}\land f_{k+1,r,r_{i,j,1}}

P2059 [JLOI2013] 卡牌游戏

ii 号卡牌上的数字为 cic_i,卡牌数目为 mm

fi,jf_{i,j} 表示有 ii 人参加游戏,且 jj 号玩家胜出的概率.显然有 f1,1=1f_{1,1}=1

考虑转移,ii 人参加游戏的状态可由 i1i-1 人参加游戏的状态转移而来.

ii 人参加游戏时的 jj 号玩家在 i1i-1 人参加游戏且该轮游戏中庄家抽出的卡牌编号为 kk 时的编号为 xi,j,kx_{i,j,k}

xi,j,k=jckmodix_{i,j,k}=j-c_{k}\bmod i

要注意的是,当 j=ckmodij=c_{k}\bmod i 时,jj 号玩家被淘汰,此时不应进行转移.

综上,我们有转移:

fi,j=1mk=1m[jckmodi]fi1,xi,j,kf_{i,j}=\frac{1}{m}\sum_{k=1}^{m}[j\not =c_{k}\bmod i]f_{i-1,x_{i,j,k}}

当然,我们可以令 fx,0=0f_{x,0}=0,转移可简化为:

fi,j=1mk=1mfi1,xi,j,kf_{i,j}=\frac{1}{m}\sum_{k=1}^{m}f_{i-1,x_{i,j,k}}

P5689 [CSP-S2019 江西] 多叉堆

每次对整棵树进行查询,考虑使用并查集进行维护.

考虑修改操作,每次修改将 vv 接到 uu 下.uu 作为新树的根,填入数字时只能填 00

sus_u 代表以 u 为根的树的大小,修改时 sus_u 直接加上 svs_v 即可.

aua_u 为以 uu 为根的树中的填数方案数.修改后 vv 的子树内共有 svs_v 个节点,可以填入 su1s_u-1 个数字,方案数为 (su1sv)\tbinom{s_u-1}{s_v}.根据乘法原理,每次修改时我们有:

au=au×av×(su1sv)a_u=a_u\times a_v\times\dbinom{s_u-1}{s_v}