标签:注意 个数 line 最大 存在 找不到 test block solution
(很早做过题不知道为什么现在才写
没什么好说的 QAQ
给出 \(n\) 个点,要求构造一个序列,使得对于每个点,可以给序列中的每个数指定一个方向(上/下/左/右),使得可以从原点到达这个点。
不是很会,三进制拆分好像可做但是不想写,莽了个倍增上去结果过了?
关于正确性,考虑归纳,每次走相当于变成了一个子问题。
给出长度为 \(n\) 的 \(01\) 串 \(S\),构造一棵树。\(S_i\) 为 \(1\) 表示存在一条边,使得割掉这条边后剩下两棵树中有一棵大小为 \(i\);第 \(i\) 位为 \(0\) 则表示不存在。
首先,容易发现若 \(S_1 = \texttt{0}\) 或 \(S_n = \texttt{1}\) 或 \(S_i \neq S_{n - i},i \in [1, n)\) 显然无解,下面说明其余情况都是有解的。
考虑构造一串菊花。具体地,若当前 \(1\) 的位置为 \(i\),下一个 \(1\) 的位置为 \(j\),则向后连一朵大小为 \(j - i\) 的菊花。容易发现这样构造符合条件。
给出每个点到其余所有点到距离和 \(d_i\)(两两不同),构造一棵符合条件的树,或判断无解。
以重心为根。则当前 \(d_i\) 最大的点一定是叶子,考虑向上走一步的贡献,则它的父亲 \(fa\) 一定满足 \(d_{fa} = d_i + 2 \times sz_i - n\),然后把这个孩子的大小病到父亲上就可以了 QAQ。
重复上述步骤 \(n - 1\) 次,就构造出了这棵树。特殊地,最后检查一下根到各点的距离和是否正确。
注意构造过程,容易发现无解当且仅当存在一个点找不到他的父亲(或者找到了它自己)。
标签:注意 个数 line 最大 存在 找不到 test block solution
原文地址:https://www.cnblogs.com/realSpongeBob/p/ARC103.html