0%

ARC103 简要题解

C - /\/\/\/

计算出 t1[]t2[] 表示奇数和偶数位置上每个数出现的次数,枚举奇数位改成了哪一种数,那么偶数位就改成不等于这个数之外的出现最多的数,用前缀和后缀最大值解决。

D - Robot Arms

首先考虑无解的情况,当存在两个点 \((x_1,y_1),(x_2,y_2)\),且 \(x_1+y_1\not\equiv x_2+y_2\pmod 2\) 时,一定无解。因为任何两个点的操作一定是把某一个 \(\pm d_i\) 改成 \(\mp d_i\),这样差一定是 \(2d_i\) 为偶数,所以所有的 \(x_i+y_i\) 奇偶性一定相同。

然后考虑构造方案,看到最多只有 \(40\) 节考虑倍增。我们让 \(d={1,2,4,\dots,2^k}\),那么通过作图可以发现,所有可以达到的点为 \(x+y<2^k\) 且为奇数的所有点。至于构造方案,从大到小枚举长度,每一次走走完后的坐标距离目标最近的点,这样一定可以走到。

如果 \(x+y\) 都是偶数,那么再添加一个 \(1\) 然后把所有点坐标都偏移一下。

E - Tr/ee

依旧先考虑无解,显然如果 \(s_1=0\)\(s_n=1\) 时无解,同时我们发现如果 \(s_i\)\(s_{n-i}\) 不同也无解,因为如果断出了一个大小为 \(i\) 的连通块,那么另一部分大小为 \(n-i\)。下面的构造方式证明其他情况一定有解。

我们首先让 \(1,2\) 连边,然后我们从 \(2\) 开始到 \(n-1\) 遍历 \(s\),记一个变量 now,其初值为 \(2\),然后每一次连接 \(now\)\(i+1\),如果 \(s_i=1\),令 \(now=i+1\)

考虑这样为什么是对的,这样构造出来的树一定是一条长链,然后每个链上的点挂了若干个点,显然切开链和挂着的点之间的边只会得到 \(1\),那么考虑切链上的边,如果从一段 dfs,那么切掉一条边后连通块大小就是某个端点的 \(size\),显然根据我们的构造方式,只会存在 \(s_i=1\)\(size\)

F - Distance Sums

我们考虑如果从 \(u\) 变到 \(v\)\(d\) 的变化。设断开 \((u,v)\) 后,两棵树的大小分别为 \(siz_u,siz_v\),则所有 \(u\) 树中的点 \(dis\) 增加 \(1\)\(v\) 树中的点 \(dis\) 减小 \(1\)。故 \(\Delta d=siz_u-siz_v=siz_u-(n-siz_u)=2siz_u-n\)。我们不难有推论:\(d\) 最小的点一定是重心,\(d\) 最大的点一定是叶子;且以重心为根,父亲的 \(d\),一定小于儿子的 \(d\)

然后我们考虑构造方案,我们把 \(d\) 从大到小排序,那么第一个一定是叶子,即它的 \(siz\) 已经确定,因为 \(d\) 两两不同,我们也就确定了它的父节点,这样我们每访问到一个点,都可以确定它的 \(siz\),也就可以一个一个确定父亲。如果某一次找不到父亲对应的 \(d\),那么一定无解。

然后如果我们都构造完了,也不一定有解。因为我们只是保证了所有 \(d\) 之间的相对大小,并没有算出 \(d\) 的值,所以我们需要随便计算一个点的 \(d\) 查看是否正确。

提交记录(按题号排序):#16938465,#16947314,#16939196,#16951309。