第九届中国大学生程序设计竞赛 深圳站(CCPC 2023 Shenzhen Site)/ The 2nd Universal Cup. Stage 25: Shenzhen

D. Bot Brothers

题意:有一棵 \(n\) 个点的树,\(m\) 个叶子,编号为 \(1 \sim m\)。两人在树上博弈,均从根出发,轮流行动,每次走向一个当前所在节点的子节点,如果在叶子就不移动。最终如果两人所在叶子编号一个是另一个 \(+1\)\(\pmod m\) 意义下),则 \(+1\) 的一方获胜。

观察到先手不可能胜利,因为后手可以和先手走一样的路。那么只需要判断先手是否能到平局即可,设 \(f_u\)\(u\) 子树中所有叶子节点的集合,\(g_u\)\(u\) 子树中所有叶子节点 \(+1\)(若是 \(m\) 则为 \(1\))的集合。设先手当前在 \(x\),后手当前在 \(y\),若 \(f_y\) 不包含 \(g_x\),那么 \(x\) 可以一直走到那个不在 \(f_y\) 出现的节点,所以后手要保证每次走完之后 \(f_y\) 都要包含 \(g_x\)

所以可以直接模拟 \((x,y)\) 的过程,\(dfs(x)\) 的时候顺便记录当前 \(y\) 的值,然后往下走的时候 \(y\) 要走到一个 \(lca(g_{x'})\) 的祖先上,那么看看 \(y\) 是不是 \(lca(g_{x'})\) 的祖先即可(记得特判 \(|g_x' =1|\) 可以不移动。

复杂度 \(\Theta(n\log n)\)

E. Two in One

题意:有一个长度为 \(n\) 的序列,找到一个区间和两种颜色使得两种颜色出现次数的二进制或最大。

若只选一个颜色肯定选 \([1,n]\) 和其中出现最多次数的区间。选两个的话,直觉告诉我们最大值肯定必选,此时看看第二个选什么,若最大值最高位是 \(t\),且存在一个其他颜色的最高位也是 \(t\),那么答案肯定可以取到 \(2^{t+1} - 1\),因为我们可以每次把区间缩减一个,当其中一个颜色出现次数 \(<2^t\) 时停止。

考虑拓展这个结论,那么就是找到两个数 \(x, y\),使得 \(x | y | highbit(x\& y)\) 最大,证明与上面类似,显然取最大和次大。

复杂度 \(\Theta(n+\log V)\)

K. Quad Kingdoms Chess

题意:给定两个军棋序列,每次两个人取出序列首部连个数,若相同同时删掉,否则小的那个删掉。判断最终结果是否为平局,支持动态单点修改。

首先观察不带修改怎么做。发现肯定先看两个序列第一次出现的最大值,它们必须得相同,否则不可能平局,然后设它们在第一个、第二个序列第一次出现位置分别是 \(x,y\),则 \(a[1,x]\)\(b[1,y]\) 可以一起删除,然后就转移到了一个子问题。

那么平局的充要条件就是把每个序列的 \(suf_i\) 为后缀最大值求出来,把所有 \(c_i = suf_i\)\(c_i\) 取出来,两个序列的这个可重集合要相等,那么直接上哈希即可。

考虑单点修改,考虑套路地上线段树,合并左右子树的时候可能左边部分有一部分后缀是小于右边最大值的,所以可以参考 楼房重建 的套路,单侧递归求得所需部分。

复杂度 \(\Theta((n+q)\log^2 n)\)

L. Rooted Tree

题意:给定一个节点,\(k\) 次每次随机选择一个叶节点往下面塞 \(m\) 个新节点,问所有节点深度总和的期望。

考虑期望的线性性,可以对每次操作新加的节点独立计算贡献。设第 \(i\) 次操作后叶子节点个数是 \(cnt_i\),叶子节点的深度期望是 \(f_i\),那么第 \(i\) 次新加的节点期望深度和就是 \((f_{i-1} + 1) \times m\),并且 \(f_{i} = \dfrac{f_{i - 1} \times cnt_{i-1} + (f_{i-1} + 1) \times m}{cnt_i}\),显然 \(cnt_i = i \cdot (m-1)+1\)

复杂度 \(\Theta(k)\)

M. 3 Sum

题意:给定 \(n\) 个大整数,求 \(a_i + a_j + a_k \equiv 0 \pmod{M},M=10^k - 1\)\((i,j,k)\) 个数。

显然可以先让每个 \(a_i\)\(M\) 取模,然后找到 \(a'_i + a'_j + a'_k = 0,M,2M\) 的个数即可。后面这个显然可以使用 hash 来解决,多用几个模数判断就行。

\(M\) 取模时,由于 \(M=10^k - 1\),那么 \(10^k \equiv 1 \pmod{M}\),可以除以 \(10^k\) 然后加上这个商继续除,显然不会超过 \(\Theta(bit)\) 次。

posted @ 2024-10-25 19:04  FantasyNumber  阅读(84)  评论(0编辑  收藏  举报