[NOIP模拟赛] 11-11 题解
posted on 2024-11-12 07:36:32 | under | source
T1
题意:有序列 \(a=\{1\dots 2n\}\),一次操作会变成 \(a_1,a_{n+1},a_2,a_{n+2}\dots a_{n},a_{2n}\),求多少次操作后变回原来的序列。
\(a_1,a_{2n}\) 显然不变,让剩下的编号减一,假如初始位置是 \(x\),那么操作后就是 \(2x\bmod (2n-1)\),求最小的 \(k\) 满足 \(\forall x,x\times 2^k\equiv x\pmod {2n-1}\)。
那么只看 \(x=1\) 即可,欧拉定理:\(2^{\phi(2n-1)}\equiv 1\),所以枚举其约数验证即可,复杂度 \(O(\sqrt n \log n)\)。
T2
题意:给出序列 \(a\),每次操作让一个位置变成全局异或和,求最少多少次操作后 \(a\) 变成 \(b\)。
定义全局异或和为 \(s\),第一次操作是找一个数变成 \(s\),然后把这个数拿走,之后的操作就是把手上的数放在位置并拿走原来的数。有解当且仅当 \(b\in \{a,s\}\)。
可以建模:让 \(b_i\to a_i\),含义是拿着 \(b_i\) 放在 \(i\) 上然后拿起 \(a_i\)。自环没有必要走,不必加边。
注意到有解时,要么所有点入度等于出度;要么存在一点出度多一(即 \(s\))且存在一点入度少一,显然两个点在同一连通块。
考虑一个连通块,两种情况:含有 \(s\),那么一定可以从它开始走欧拉路径;不含 \(s\),那么只能走欧拉回路抵消掉一开始放的 \(s\)。
T3
题意:可以给一棵树每个点染上黑或白色,定义一种染色的权值为最远同色点对距离,求所有染色方案的权值之和。
纯纯套路题,建议降蓝。
显然拎直径 \(c_1\dots c_m\),假如 \(c_1,c_m\) 同色很好求贡献,考虑不同色。
容易发现,最远同色点对必然有一端是 \(c_1\) 或 \(c_m\),证明不难,利用直径性质反证即可。
这样每个点独立,不妨用二元组 \((x_i,y_i)\) 表示第 \(i\) 个点颜色和 \(c_1\) 或 \(c_m\) 相同时的距离,那么问题转化为:每个二元组中选取一个元素,需要求出 \(f_i\) 表示元素最大值恰为 \(i\) 的方案数。
发现不好直接 dp,简化问题,十分套路地求 \(g_i\) 表示最大值 \(\le i\) 的情况,则 \(f_i=g_i-g_{i-1}\)。不妨扫描线,维护 \(cnt_i\) 表示当前第 \(i\) 个点有几种选择,那么扫到 \(j\) 时 \(g_j=\prod cnt\)。
复杂度 \(O(n\log n)\),排序是瓶颈,可以桶排做到线性。
T4
题意:有一棵 \(n\) 个点的树,一开始在 \(1\) 要走到 \(n\),你需要对所有的点恰好做一次操作,一次操作会使得当前点向它走一步(不能原地踏步),最小化被经过的节点数量。
牛子题。
把 \(1\to n\) 路径拎起来,分别为 \(c_1\dots c_m\),挂着子树 \(t_1\dots t_m\)。
发现很多操作都会被抵消,记 \(len=dist(1,n)\),那也就是钦定 \(len\) 个点是“被占用的”,然后让剩下的点一一配对进行抵消。一定能构造出来合法方案。
显然 \(n-len\) 是奇数一定无解,否则有解,详见下文。
配对情况比较复杂,不妨从简单情况入手,假设只经过 \(c_1\dots c_m\)。那么配对的两点来自不同的 \(t\),记 \(siz_i=|t_i|\),\(t_i\) 有 \(h_i\) 个未被占用的点,根据经典结论 \(h\) 不能有绝对众数。
\(\sum h=n-len\),肯定贪心地尽量多占用绝对众数中的点,也就是对于最大的 \(t_p\),要满足 \(t_p-p+1\le \frac {n-len}2\),因为至多放 \(p-1\) 个占用点。换句话说,每个点都要满足 \(t_i-i+1\le \frac {n-len}2\)。这是充要条件。
补充下证明:假如 \(\forall i,t_i\le \frac {n-len}2\) 那么肯定有解,否则让最大的那个尽量多减,假如还是不行就无解;否则可以让它减到恰好 \(\frac {n-len}2\),剩下的随便分配,显然无论如何都不可能 \(>\frac {n-len}2\)。
假如不满足,那么找到这个 \(c_k\),需要深入其子树。我们可以允许经过其子节点 \(p\),也就是允许一边在 \(p\) 子树内、一边在其子树外的配对出现,这种配对可以在走到 \(c_k\) 时进行。
此时,\(p\) 子树可以视为新的 \(h\),其地位与 \(h_k\) 相等,并且允许在该子树内放 \(k\) 个占用点。以此类推,可以在 \(t_k\) 中断掉若干条边,需要满足这些边连通且与 \(c_k\) 相连,同时把这些边断掉得到若干子树,每个子树大小 \(siz\) 满足 \(siz-k+1\le \frac {n-len}2\)。
对于这个问题,可以 \(O(n^2)\) 的树形 dp 解决,上述限制等价于每个 \(siz\le K\),\(K=\frac {n-len}2 +k-1\)。注意到 \(2K\ge N\),所以非法的点构成一条链(重链),链尾节点一定删去若干子树(先删最大的),然后根据要求链也一定要删。这是答案下界而且能构造。
复杂度 \(O(n\log n)\),桶排即可 \(O(n)\)。

浙公网安备 33010602011771号