Codeforces Round 884
https://codeforces.com/contest/1844
G - Tree Weights
n个点 有边权(wi > 0权重未知)的树
给所有 i到i+1简单路径的长度di
求任意一个合法的边权方案,或者无方案
n 1e5
di [1,1e12]
5s
256mb
我的思路
根不影响点间距离和边长,因此直接把1选做根
首先 可以 n log n 算所有 i与i+1的 lca
$u_i = lca(i,i+1)$
$path(i,i+1) = path(i,u_i)+path(i+1,u_i) = dep_i + dep_{i+1} - 2 dep_{u_i}$
所以可以得到一个 $(n-1)$行$(n+1)$列(其中一列是增广列) 矩阵
尝试求正解即可
它是一个 系数矩阵非零项 不多于 $4(n-1)$
然而 并不会解稀疏矩阵, 还要把距离弄正
题解
跟我想的一样 也是 先去掉树变成单纯的线性代数问题
然后神奇的来了,
因为求解的值域在整数(正整数), 系数也是整数, 考虑把 线性方程的所有值, 放入 mod 2
那么在 mod 2的情况下, 上面的表达式就变成 $dep_i + dep_{i+1} \equiv path(i,i+1) \pmod 2$
那么因为1是根, $dep_1 \equiv 0 \pmod 2$, 从而 $dep_2,dep_3,\cdots,dep_n \pmod 2$都可以计算出了
所以 上面的 $x_i+x_{i+1}-x_{lca(i,i+1)} = b_i$ 的最低位确定了
$x_i=2y_i+z_i(=0/1)$
$(2y_i+z_i) + (2y_{i+1}+z_{i+1}) - 2(2y_{lca(i,i+1)}+z_{lca(i,i+1)}) = b_i$
$y_i+y_{i+1} - 2y_{lca(i,i+1)} = \frac{b_i-z_i-z_{i+1}+2z_{lca(i,i+1)}}{2}$, 当这里始终可以整除,但这里为负数时就是无解
所以变成了子问题
注意到 $10^{12} \ge d \ge \max{edge}$
$dep \le n \max edge \le 10^{17}$
1 | >>> 2**64 |
所以 $O(n \log (nd))$ 可做
最后再额外验证一下(吗?,或者验证高位剩余是0)
这样看的话, 如果有答案,只有唯一答案,虽然我拿到题目的时候就有感觉似乎并不能”任意有效解”
H - …
总结
F1,F2
结论能猜对,证不了,还写了bug, 有个图形上的直觉
G
这个 mod 2可真神奇,我开始以为会有什么加速矩阵的运算方法,
https://brilliant.org/wiki/hensels-lemma/
H
哎 cf的题目就是, 这种学了题解会觉得真妙,amazing, 但是下次再见同样的技巧,不知道会是哪一年了
参考
https://codeforces.com/blog/entry/118128
$1-\frac{n!k!\sum_{i=0}^{i\le k/2} \frac{1}{i!(n-k+i)!(k-2i)!2^i}}{n^k}$