ZJOI2019 补题记录
麻将
补题的时候不会做,看了题解才会。
首先将期望转化成 (sum_{i=0}^{4n-13} P_i) ,其中 (P_i) 是第 (i) 巡还没有和牌的概率。考虑给定前 (i) 巡的牌,如何判断是否能和。记 (num[i]) 为前 (i) 巡以及初始的牌中第 (i) 种牌的数量,首先将七对子特殊处理,判断 (cnt = sum_{i=1}^n [num[i]geq 2]) 是否 (geq 7) 即可。然后令 (f[i][j][k][t]) 表示当前考虑了前 (i) 种牌,保留了 (j) 张 (i) ,(k) 张 ((i-1,i)) ,(t) 对雀头后能形成的最多的面子数量,转移显然,只需要判断是否存在 (f[n][j][k][1] geq 4) 即可。考虑对于每一种 (num) 的集合,都对应了一组 (f[j][k][t]) ,并且添加一种牌的 (num) 相当于转移到另一组 (f[j][k][t]) ,那么我们可以把这个 DP 当做一个自动机来维护,去掉重复节点以及可以和牌的节点后,自动机的节点数是 (2092) 。我们可以令 (F[i][x]) 表示添加了 (i) 种牌后,当前在自动机节点 (x) 的方案数,转移直接利用自动机上的转移边即可,这样就算出了每一个 (P_i) 。
线段树
补题的时候比较菜,只写了一个非常傻逼的 (mathcal O(nlog^2n)) 的做法。
问题等价于求所有操作选取方案下的答案和,考虑每个节点的贡献独立,可以对每个节点分开来考虑,对于一个节点,我们把操作分成 5 类。
A:访问该节点父亲但未访问该节点,访问该节点兄弟节点 B:访问该节点并继续访问该节点儿子节点 C:访问该节点祖先节点并打标记 D:访问该节点并打标记 E:其他情况
一个节点的贡献就是求这个操作序列有多少个子序列,满足最后一个 CA 或者最后一个D 之后不存在 B,这个东西显然可以将操作序列求出来后 DP,同时也可以直接线段树维护。考虑记 (s_1) 为当前该节点还可以继续添加C或A的有贡献子序列数量,(s_2) 为当前节点还可以添加 C 的有贡献子序列数量,(c) 为当前节点以C结尾的序列数量,(num) 为当前节点有效操作的数量。
A: (s_1 = 2s_1+c, s_2 = s_2,c=c,num+1)
B: (s_1 = s_1, s_2 = s_2,c=c,num+1)
C: (s_1 = s_1, s_2 = s_1 + 2s_2, c =c+2^{num},num+1)
D: (s_1 = s_1+2^{num-1}, s_2 = s_2, c = c,num+1)
E: (s_1 = 2s_1,s_2 =2s_2)
可以在 ABCD操作的时候乘 (frac{1}{2}) ,最后乘 (2^n) 然后直接不管 E 操作,现在 A, B, D 三类操作影响节点数量都是 小于等于 (mathcal O(log n)) 级别的,在线段树上暴力维护,对于 C 类操作,打标记维护。考虑每次做一个 C 类操作相当于做一次矩阵乘法,那么标记可以先合并次数,最后做 (mathcal O(log n)) 次向量乘法完成下放即可。
Minimax搜索
想了一个小时才会 70 分,然后马上会 100 分了但是调了4h才过。
考虑暴力 (dp[u][L][R]) 表示考虑节点 (u) 子树,当前 (u) 的权值可以调整到 ([L,R]) 之间的任意的数的方案数,发现这个东西转移是所有的 (L) 取 maxmin 以及所有的 (R) 取 maxmin。然后考虑容斥,求最终不能改变的方案数,设 (p) 为不操作时最终的答案。那么对于每一个点需要知道 (sum_{Rleq p}dp[u][L][R]) 和 (sum_{Lgeq p} dp[u][L][R]) 即可维护转移,那么每个点要记的 (dp) 状态只有两个了,可以做到 (mathcal O(n)) 求一个 (K) 。
对于剩下的部分,发现 (K) 改变时最多只会改变 (mathcal O(1)) 个叶子的初始 (dp) 值,用动态 (dp) 大力维护即可。
开关
根本不会做,看题解才会
记 (F(x)) 为 (x) 步恰好在目标状态的指母函数,(F(x)=frac{1}{2} prod_{i=1}^n(e^{frac{p[i]}{S}x}+(-1)^{s_i}e^{-frac{p[i]}{S}x})) ,(G(x)=frac{1}{2}prod_{i=1}^n (e^{frac{p[i]}{S}x}+e^{-frac{p[i]}{S}x})) ,把 (F(x), G(x)) 改成OGF形式 (f(x),g(x)) 答案就是 (h(x)=frac{f(x)}{g(x)}, h'(x)) ,然后推推式子就完事了,我推不动。
语言
有一个trick是 (m) 个点的虚树大小可以排好 (dfn) 序后减去相邻的 (lca) 的深度,然后线段树合并就完事了