ARC 103

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

题目链接

C

没什么好说的 QAQ

Code

D

Description

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

Solution

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

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

Code

E

Description

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

Solution

首先,容易发现若 \(S_1 = \texttt{0}\)\(S_n = \texttt{1}\)\(S_i \neq 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 \times sz_i - n\),然后把这个孩子的大小并到父亲上就可以了 QAQ。

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

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

Code

posted @ 2020-02-15 10:37  realSpongeBob  阅读(128)  评论(0编辑  收藏  举报