CSAcademy FIICode 2021 1 & 2 部分题解

Contest 1.

C

因为 \(A,B\) 加入的前缀确定时,新加入一个数的贡献也确定,所以我们可以预处理 \(invA _ {i,j}\) 表示加入 \(a _ i\)\(A\) 长为 \(i - 1\)\(B\) 长为 \(j\) 的前缀构成的 \(c\) 时的贡献,\(invB _ {i,j}\) 同理。

这个很显然:

\[invA _ {i,j} = \begin{cases} \sum _ {k = 1} ^ {i - 1} [a _ k \gt a _ i],j = 0 \\ invA _ {i,j - 1} + [b _ j \gt a _ i],\text{Otherwise} \end{cases},invB _ {i,j} = \begin{cases} \sum _ {k = 1} ^ {j - 1} [b _ k \gt b _ j],i = 0 \\ invB _ {i - 1,j} + [a _ i \gt b _ j],\text{Otherwise} \end{cases} \]

然后设 \(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)\)

posted @ 2025-05-20 19:58  xguagua_233  阅读(6)  评论(0)    收藏  举报