ARC 103

(很早做过题不知道为什么现在才写

题目链接

C

没什么好说的 QAQ

Code

D

Description

给出 (n) 个点,要求构造一个序列,使得对于每个点,可以给序列中的每个数指定一个方向(上/下/左/右),使得可以从原点到达这个点。

Solution

不是很会,三进制拆分好像可做但是不想写,莽了个倍增上去结果过了?

关于正确性,考虑归纳,每次走相当于变成了一个子问题。

Code

E

Description

给出长度为 (n)(01)(S),构造一棵树。(S_i)(1) 表示存在一条边,使得割掉这条边后剩下两棵树中有一棵大小为 (i);第 (i) 位为 (0) 则表示不存在。

Solution

首先,容易发现若 (S_1 = exttt{0})(S_n = exttt{1})(S_i eq S_{n - i},i in [1, n)) 显然无解,下面说明其余情况都是有解的。

考虑构造一串菊花。具体地,若当前 (1) 的位置为 (i),下一个 (1) 的位置为 (j),则向后连一朵大小为 (j - i) 的菊花。容易发现这样构造符合条件。

Code

F

Description

给出每个点到其余所有点到距离和 (d_i)(两两不同),构造一棵符合条件的树,或判断无解。

Solution

以重心为根。则当前 (d_i) 最大的点一定是叶子,考虑向上走一步的贡献,则它的父亲 (fa) 一定满足 (d_{fa} = d_i + 2 imes sz_i - n),然后把这个孩子的大小并到父亲上就可以了 QAQ。

重复上述步骤 (n - 1) 次,就构造出了这棵树。特殊地,最后检查一下根到各点的距离和是否正确。

注意构造过程,容易发现无解当且仅当存在一个点找不到他的父亲(或者找到了它自己)。

Code

原文地址:https://www.cnblogs.com/realSpongeBob/p/ARC103.html