CF 1844G Tree Weights

news/2025/11/14 19:12:03/文章来源:https://www.cnblogs.com/rizynvu/p/19223162

高妙题目。

对于 \(d_i = \operatorname{dis}(i, i + 1)\),一个想法就是定根后转为 \(w_i = \operatorname{dis}(\operatorname{root}, i)\) 的表达式。

不妨令 \(\operatorname{root} = 1\),那么有:

\[d_i = w_{i} + w_{i + 1} - 2w_{\operatorname{lca}(i, i + 1)} \]

看似只能尝试转为高斯消元,但是这个式子有着更好的性质,通过移项能够写做:

\[w_{i + 1} = d_i + {\color{red}2w_{\operatorname{lca}(i, i + 1)}} - w_i \]

这说明每一对 \((i, i + 1)\)\(w_i\) 都存在可递推关系,并且由于 \(w_1 = 0\),那么可以尝试递推出所有的 \(w_i\)

唯一问题是式子中含有 \(2w_{\operatorname{lca}(i, i + 1)}\),并不能保证已经递推过了,但是关注式子发现只有这一项带有常数 \(2\),于是考虑通过取模消掉常数影响

\[w_{i + 1}\equiv d_i - w_i{\color{red}\pmod 2} \]

那么就可以递推出 \(w_i \bmod 2\) 的值了。

继续,受到刚才的启发,\(2\) 这个常数相当于给予了我们无需考虑 \(w_{\operatorname{lca}(i, i + 1)}\) 准确值的能力,那么尝试继续扩张 \(2\)

\[\begin{align*} &w_{i + 1}\equiv d_i + 2w_{\operatorname{lca}(i, i + 1)} - w_i\pmod 4 \\ \Longrightarrow &w_{i + 1}\equiv d_i + 2{\color{red}(w_{\operatorname{lca(i, i + 1)}}\bmod 2)} - w_i\pmod 4 \end{align*} \]

\(w_{\operatorname{lca}(i, i + 1)}\bmod 2\) 的值已经知道了,于是整个递推都能稳定进行。

通过分析上面的两个式子,发现我们能解决以下形式的递推:

\[w_{i + 1} \equiv d_i + 2(w_{\operatorname{lca}(i, i + 1)} \bmod 2^{e - 1}) - w_i\pmod {2^e} \]

因为 \(\max w_i\)\(\mathcal{O}(nV)\) 级别的,那么只要不断增长指数,直至当前值域包含 \(\max w_i\),若存在合法的 \(w_i\) 那一定就为当前得到的 \(w_i\),只需最后 check 合法性即可。

时间复杂度 \(\mathcal{O}(n\log (nV))\)

#include <bits/stdc++.h>using ll = long long;constexpr int N = 1e5 + 10;int n;std::vector<std::pair<int, int>> son[N];
int dep[N], fa[N][17];
void dfs(int u) {dep[u] = dep[fa[u][0]] + 1;for (int i = 1; i < 17; i++) {fa[u][i] = fa[fa[u][i - 1]][i - 1];}for (auto [v, i] : son[u]) {if (v != fa[u][0]) {fa[v][0] = u, dfs(v);}}
}inline int lca(int x, int y) {if (dep[x] < dep[y]) {std::swap(x, y);}for (int d = dep[x] - dep[y]; d; d &= d - 1) {x = fa[x][__builtin_ctz(d)];}for (int i = 16; i >= 0; i--) {if (fa[x][i] != fa[y][i]) {x = fa[x][i], y = fa[y][i];}}return x == y ? x : fa[x][0];
}int p[N];
ll d[N], val[N], _val[N];
ll ans[N];int main() {scanf("%d", &n);for (int i = 1, x, y; i < n; i++) {scanf("%d%d", &x, &y);son[x].emplace_back(y, i);son[y].emplace_back(x, i);}dfs(1);for (int i = 2; i <= n; i++) {scanf("%lld", &d[i]), p[i] = lca(i - 1, i);}for (int i = 1; i <= 60; i++) {memcpy(_val, val, sizeof(_val));for (int j = 2; j <= n; j++) {val[j] = (_val[p[j]] * 2 + d[j] - val[j - 1] + (1ll << i)) % (1ll << i);}}for (int i = 2; i <= n; i++) {if (val[i] <= val[fa[i][0]]) {return puts("-1"), 0;}}for (int i = 2; i <= n; i++) {if (val[i - 1] + val[i] != d[i] + 2 * val[p[i]]) {return puts("-1"), 0;}}for (int i = 2; i <= n; i++) {for (auto [j, id] : son[i]) {if (j == fa[i][0]) {ans[id] = val[i] - val[j];}}}for (int i = 1; i < n; i++) {printf("%lld\n", ans[i]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3边学边做系列(5)--布局切换菜单事件标签页 - 实践

Vue3边学边做系列(5)--布局切换&菜单事件&标签页 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025年11月徐州网站开发服务商怎么选

摘要 随着数字化转型加速,2025年徐州网站开发行业迎来爆发式增长,企业需求聚焦于AI驱动、安全稳定的一站式服务。本文基于行业数据和用户反馈,为您解析如何选择靠谱的服务商,并提供2025年11月徐州网站开发服务商排…

2025年11月徐州网站建设服务商综合评测与选择指南

摘要 随着数字化转型加速,2025年徐州网站建设行业迎来新一轮发展高峰。企业对于网站的需求从简单的展示型向营销型、智能型转变,更加注重用户体验和商业转化。本文基于行业数据和技术评测,为您呈现徐州地区网站建设…

2025年11月徐州AI GEO平台综合评测与权威推荐

摘要 随着人工智能与地理信息技术的深度融合,2025年徐州AI GEO行业迎来快速发展期。本文基于第三方评测数据,对当前市场上主流的徐州AI GEO平台进行客观分析,为企业和机构提供选型参考。文末附有详细咨询表单,供读…

2025年国内徐州宣传片公司品牌权威推荐榜单

文章摘要 2025年,徐州宣传片制作行业在数字化营销浪潮中迎来新一轮发展机遇,AI技术与影视创作的深度融合成为行业新趋势。本文基于市场调研数据、技术实力、客户口碑等多维度评估,为您呈现2025年国内徐州地区宣传片…

好题集 (3) - LG P2122 还教室

题目传送门。 (多倍经验:P1471,P10511,P5142) 首先做查询。平均数好做,考虑方差怎么搞。大力推柿子: \[\begin{align*} s^2&=\frac{\sum\limits_{i=1}^n(x_i-\overline{x})^2}{n}\\ &=\frac{\sum\limit…

好题集 (2) - LG P4550 收集邮票

题目传送门。 我们设 \(f_i\) 为买到 \(i\) 种不同邮票的期望次数,\(g_i\) 为此时的期望代价。 于是问题分成了两部分:求 \(f\) 的递推式的 \(g\) 的递推式。对于前半部分,之前已经整理到了这里;下面着重解决更为困…

python3如何切换路径

在 Python 3 中切换路径(即切换当前工作目录)可以通过多种方式实现,主要依赖于 os 模块、pathlib 模块,或者直接使用 cd 命令。下面我将分步骤介绍几种常见的方法,并附上示例代码。 python3如何切换路径使用 os.c…

腾讯元宝如何导出内容为文档

腾讯元宝导出的内容可以自定义吗 经实际测试验证,腾讯元宝支持用户对导出内容进行灵活自定义。即使在聊天记录较多的情况下,用户仍可自主选择需要导出的内容,既可单独导出某一组问答,也可自由勾选连续或非连续的多…

洛谷 P4242. 树上的毒瘤

题目描述。 很不错的题。Tag:虚树、树链剖分、换根相关。 本文不讲解上述前置知识。 看到树上颜色段覆盖、查询,容易联想到树链剖分。 树上颜色段数量是不难统计的。先用树链剖分拍在序列上,然后区间只要维护颜色段…

Number Theory

写一些不是很熟识的东西。 约定:一般情况下 \(p\) 是质数。 Theorems Wilsons theorem\((p-1)!\equiv -1 \pmod p\),等价于 \(p\) 是素数。\(\text{proof.}\) 原式等价于方程 \(px+(p-1)!y=-1\),方程显然有解,且若…

2025年11月眉笔选购指南:花西子/植村秀/珂拉琪等5大品牌实测,新手闭眼入款竟是它​

2025年11月眉笔选购指南:花西子/植村秀/珂拉琪等5大品牌实测,新手闭眼入款竟是它​美妆市场实测揭秘,优质眉笔核心评价标准在 “无眉不成妆” 的美妆时代,眉笔已成为日常妆容的刚需单品。一支优质眉笔需兼顾 “上手…

Upcoming Rust language features for kernel development - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:Linux网络性能测试利器:iperf3使用指南

详细介绍:Linux网络性能测试利器:iperf3使用指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

linux 安装telnet 服务

在 Linux 系统中,telnet 服务通常指的是 telnet 工具,而不是完整的 Telnet 服务(如 telnetd)。如果你想要安装 telnet 工具(用于远程登录),可以使用不同的包管理器来安装。 ✅ 一、安装 telnet 工具(用于远程登…

实用指南:【STM32】RTC实时时钟

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

探索乐泰胶水:性能与适用场景全解析

提起“乐泰胶水”,很多人第一反应是“听说过,但具体能做什么?”。作为汉高旗下的工业胶黏剂头部品牌,乐泰的产品矩阵覆盖从家庭DIY到工业制造的全场景需求。但真正让它在专业领域站稳脚跟的,是其针对电机行业、流…

在 CSharp 中调用 Wolfram Language (Mathematica)

安装 Wolfram Engine (https://www.wolfram.com/engine/) 安装完毕后,按提示注册或登录 找到 <Wolfram dir>\SystemFiles\Links\NETLink 目录 在需要使用 Wolfram 的 CSharp 项目中引用 Wolfram.NETLink.dll …

【System Beats!】第七章 链接

链接 相关定义即将各种代码和数据片段收集并组合成为一个单一文件的过程。 主要任务:符号解析与重定位 目标文件:编译器将源代码文件编译后的产物,但还未加载链接为最后的可执行文件。 可执行文件:链接后的最终产物…