当前位置: 首页 > news >正文

CF 1844G Tree Weights

高妙题目。

对于 \(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.gsyq.cn/news/49774.html

相关文章:

  • Vue3边学边做系列(5)--布局切换菜单事件标签页 - 实践
  • 2025年11月徐州网站建设服务商综合评测与选择指南
  • 2025年11月眉笔选购指南:花西子/植村秀/珂拉琪等5大品牌实测,新手闭眼入款竟是它​
  • Upcoming Rust language features for kernel development - 教程
  • 详细介绍:Linux网络性能测试利器:iperf3使用指南
  • linux 安装telnet 服务
  • 2025高压合金管实力厂家推荐榜:5310/6479 高压合金管型号领衔,天津大无缝联合钢铁有限公司五星领跑工业用材赛道
  • 2025扫描电镜精选榜:富泰微五星领衔,日立、国仪携超高分辨率/钨灯丝 SEM,适配科研工业多元需求
  • 2025济南单招综评培训机构排行榜:3 家实力学校口碑出圈 易升教育五星优选 解锁适配不同考生的升学备考靠谱路径
  • 102302141_易敏亮第三次数据采集作业
  • 2025广东洗头机厂家推荐榜:盛泰科技领衔,三大品牌解锁高效洗护新体验
  • mysql数据设计中的性能分析工具
  • 2025北京日式搬家公司企业推荐:单位搬家公司/北京搬家公司电话/全流程服务与技术实力深度解析
  • 2025年第43周数字取证与事件响应技术动态
  • 深入解析:【Linux基础学习】Linux Ubuntu 权限管理:从入门到精通
  • 看不见的核安全:核控制系统如何降低测试风险?
  • 2025 最新护栏网厂家推荐排行榜,公路铁路 / 机场 / 市政工程优质厂家实力甄选铁路护栏网/勾花护栏网/机场护栏网公司推荐
  • 2025 年石笼网厂家最新推荐排行榜:箱形 / 网垫 / 袋形 / 帘形全品类,电镀锌 / 锌铝合金 / 电焊材质优质厂家权威推荐
  • spark热点key导致的数据倾斜复现和加盐处理 - 指南
  • Netty和Tomcat
  • 2025 年微矩形 /圆形/矩形电连接器厂家最新推荐排行榜,涵盖 MDC/ZMDM/Y50X 等系列优质品牌精选
  • SQL 中 SELECT 查询语句知识点
  • C++ 进阶知识点详细教程 - 第3部分
  • 2025 年 11 月合肥搬家公司推荐排行榜,合肥正规搬家公司,合肥市搬家公司,包河区搬家公司,蜀山区搬家公司,专业高效与贴心服务口碑之选
  • 消息队列原理和对比
  • 2025年包装箱厂家权威推荐榜单:物流纸箱/精裱盒/服装包装箱源头厂家精选
  • vue2 组件封装 el-input
  • 2025 最新广州补习培训机构权威推荐榜:综合实力、提分效果与口碑测评,优质补习机构最新推荐广州课外补习/广州补课/广州提分/广州学习机构推荐
  • C++ 进阶知识点详细教程 - 第1部分
  • HIPCXX