【CF1844G】Tree Weights

题目

题目链接:https://codeforces.com/contest/1844/problem/G
给定一棵 n 个点的树,每条边有一个未知的正整数边权,给出 di 表示点 i 到点 i+1 的距离,求出每条边的边权或判定无解。
n105,di1012

1|0思路


ans[i] 表示点 i 到跟的距离,那么 ans[i]+ans[i+1]2×ans[lca(i,i+1)]=di
考虑在模 2 意义下的题目,也就是求出每条边二进制下最低位的值,显然此时 2×ans[lca(i,i+1)]0(mod2),也就有

ans[i+1]dians[i](mod2)

注意到 ans[1]=0,那么我们就可以扫一遍求出来。
然后对于每个 di,就可以减去其路径上的边二进制下最低位的贡献,然后继续求每条边二进制下倒数第二位的值,以此类推。
时间复杂度 O(nlog(nV))V 是值域。注意要记忆化两个点的 LCA。

2|0代码


#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=100010,LG=18; int n,X[N],Y[N],dep[N],g[N],fa[N][LG+1]; ll dis[N],ans[N],val[N]; vector<int> e[N]; void dfs(int x,int fat) { dep[x]=dep[fat]+1; fa[x][0]=fat; for (int i=1;i<=LG;i++) fa[x][i]=fa[fa[x][i-1]][i-1]; for (auto v:e[x]) if (v!=fat) dfs(v,x); } int lca(int z) { if (g[z]) return g[z]; int x=z,y=z+1; if (dep[x]<dep[y]) swap(x,y); for (int i=LG;i>=0;i--) if (dep[fa[x][i]]>=dep[y]) x=fa[x][i]; if (x==y) return x; for (int i=LG;i>=0;i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; return g[z]=fa[x][0]; } int main() { scanf("%d",&n); for (int i=1;i<n;i++) { scanf("%d%d",&X[i],&Y[i]); e[X[i]].push_back(Y[i]); e[Y[i]].push_back(X[i]); } for (int i=1;i<n;i++) scanf("%lld",&dis[i]); dfs(1,0); for (int j=0;j<=57;j++) { for (int i=1;i<n;i++) { val[i+1]=(dis[i]-val[i]+2LL)&1LL; ans[i+1]+=(val[i+1]<<(1LL*j)); } for (int i=1;i<n;i++) dis[i]=((dis[i]-(val[i]+val[i+1]-2LL*val[lca(i)]))>>1); } for (int i=1;i<n;i++) if (dis[i]!=0LL || ans[i+1]<=ans[fa[i+1][0]]) return printf("-1"),0; for (int i=1;i<n;i++) if (dep[X[i]]<dep[Y[i]]) printf("%lld\n",ans[Y[i]]-ans[fa[Y[i]][0]]); else printf("%lld\n",ans[X[i]]-ans[fa[X[i]][0]]); return 0; }

__EOF__

本文作者stoorz
本文链接https://www.cnblogs.com/stoorz/p/17571593.html
关于博主:菜死了 /fad
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   stoorz  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-07-21 【LOJ#3005】Limited Memory
2021-07-21 【BZOJ2407】探险
点击右上角即可分享
微信分享提示