CSAcademy FIICode 2021 1 & 2 部分题解
Contest 1.
C
因为 \(A,B\) 加入的前缀确定时,新加入一个数的贡献也确定,所以我们可以预处理 \(invA _ {i,j}\) 表示加入 \(a _ i\) 到 \(A\) 长为 \(i - 1\),\(B\) 长为 \(j\) 的前缀构成的 \(c\) 时的贡献,\(invB _ {i,j}\) 同理。
这个很显然:
然后设 \(dp _ {i,j}\) 表示用 \(A\) 的前缀 \(i\),\(B\) 的前缀 \(j\) 构成的 \(c\) 的答案,则 \(dp _ {i,0} = \sum _ {j = 1} ^ i invA _ {j,0},dp _ {0,i} = \sum _ {j = 1} ^ i invB _ {0,j}\),然后 \(dp _ {i,j} = \max \{ dp _ {i - 1,j} + invA _ {i,j},dp _ {i,j - 1} + invB _ {i,j} \}\),最后答案是 \(dp _ {m,n}\)
D
挺有意思的树上 DS 题。
明显可以直接 ETT/SATT,但是更明显的我懒得写,所以去码头找点性质。
观察到在原树上,如果 \(y\) 在 \(x\) 的子树中,我们就可以直接操作这个子树,否则,\(x\) 一定在 \(y\) 上面那棵子树里面,可以直接对整棵树加然后给 \(y\) 的子树减。
找一棵子树的根节点可以直接倍增,然后拍进 DFS 序之后上树状数组维护。
Contest 2.
C
只有前缀不带修的炸脖龙。
很明显,我们可以直接用扩展欧拉定理去做。操作等同于 \(a _ i \gets {a _ i} ^ {a _ {i - 1} ^ {\ldots ^ {a _ 1}}}\),然后考虑取模,由扩展欧拉定理得原式等于 ${a _ i} ^ {{{a _ {i - 1}} ^ \ldots} ^ {{a _ 1} \bmod \varphi (\varphi(\ldots \varphi(p)))} \bmod \varphi(\varphi(p))} \bmod \varphi(p) $,然后发现取一次 \(\varphi\) 这个值至少会减半,而减到 \(1\) 之后上面的指数就没用了,所以可以直接暴力取 \(\varphi\),然后就没了,预处理一下可能的 \(\varphi\) 然后对每个 \(i\) 求解,时间复杂度是 \(\Omicron(n \log ^ 2 n)\)