2024.11.27 test

A

序列 \(A=\{1,2,\dots,n\}\),求交换两个不同位置的方案,使得存在 \(i\) 前缀的和等于 \(i+1\) 后缀的和。

考虑二分出最大的 \(p\) 使得 \(sum_p\le \frac{1}{2}sum_n\),那么最后是 \(p\)\(p-1\) 的和满足条件。
求出 \(dif=\frac{1}{2}sum_n-sum_p\),那么需要在 \([1,p]\)\([p+1,n]\) 中各取一个数使得差为 \(dif\)
考虑求 \([1+dif,p+dif],[p+1,n]\) 的交集大小即为答案。
特判若 \(dif=0\),交换不影响到 \(p\) 位置即可。

B

UNO 牌是四种颜色与 \(1\sim n\) 数字的组合。求 \(2^{4n}\) 种手牌集合中有多少个可以一次打完。
规则是:你先出一张牌,然后后续出的每张牌都必须颜色和数字其中一个与上一张相同。
你可以复制任意次你的手牌。\(n\le 10^{18}\)

充要条件是所有牌“联通”即可。那么考虑 dp 状态设前 \(i\) 个数字,当前形成的集合划分是怎么样的。
考虑用并查集维护颜色形成的集合。只有 \(52\) 种状态,对应每种颜色子集大小的贝尔数之和。
dp 优化考虑矩阵快速幂即可。

C

一棵树上每个点有棋子,双方轮流操作,每次可以将一个棋子移动到其子树除了其本身的点处。
\(m\) 次修改,每次给一条链加棋子,或者给子树加棋子,并换根,问当前 SG 值。

一个子树的 SG 值就是其最深的点的深度。放棋子相当于翻转状态。答案即为状态为 \(1\) 的点异或和。
我们先定一个根。注意到,一个点的 SG 值只有两种取值,换的根在子树内还是外。
我们处理出 \(f_u\) 表示 \(u\) 子树内的最远距离;\(g_u\) 表示扣掉 \(u\) 子树后距离 \(fa_u\) 的最远距离。
所以我们写两棵线段树分别维护 \(f,g\) 即可。
假设换根到 \(r\)\(r\) 到根的所有 \(f\) 变成 \(g\)。其他不变。特殊注意 \(r\) 和根。
需要特别注意 \(f,g\) 的修改和查询后有所不同。

posted @ 2024-11-27 19:30  s1monG  阅读(2)  评论(0编辑  收藏  举报