CF1844G Tree Weights
CF1844G Tree Weights
神仙题。
思路
设
移项得到,
注意力惊人,发现等式右边带一个
于是
这样我们求出了
能不能通过类似递推的方式求出
基于一个数第
注意到
特判
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+5;
int n,cok;
int LCA[maxn],st[maxn][20],dfn[maxn],u[maxn],v[maxn];
ll mod=2;
ll d[maxn],x[maxn],tmp[maxn];
vector<int>E[maxn];
inline void dfs(int u,int f)
{
dfn[u]=++cok;st[cok][0]=f;
for(auto v:E[u])
{
if(v==f) continue;
dfs(v,u);
}
}
inline int Min(int u,int v){return dfn[u]<dfn[v]?u:v;}
inline void init()
{
for(int i=1;i<=20;i++) for(int j=1;j<=(n-(1<<i)+1);j++)
st[j][i]=Min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}
inline int Lca(int u,int v)
{
if(u==v) return u;
if(dfn[u]>dfn[v]) swap(u,v);
int l=dfn[u]+1,r=dfn[v],k=log2(r-l+1);
return Min(st[l][k],st[r-(1<<k)+1][k]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u[i],&v[i]);
E[u[i]].emplace_back(v[i]),E[v[i]].emplace_back(u[i]);
}
dfs(1,0);
init();
for(int i=1;i<n;i++) LCA[i]=Lca(i,i+1);
for(int i=1;i<n;i++) scanf("%lld",&d[i]);
for(mod=2;mod<=(1ll<<60);mod<<=1)
{
for(int i=1;i<=n;i++) tmp[i]=x[i];
for(int i=1;i<n;i++) x[i+1]=(d[i]%mod+2*tmp[LCA[i]]%mod-x[i]+mod)%mod;
}
for(int i=2;i<=n;i++) if(x[st[dfn[i]][0]]>=x[i]) {puts("-1");return 0;}
for(int i=1;i<n;i++)
{
if(d[i]!=x[i]+x[i+1]-2*x[LCA[i]]) {puts("-1");return 0;}
}
for(int i=1;i<n;i++)
{
if(dfn[u[i]]>dfn[v[i]]) swap(u[i],v[i]);
printf("%lld\n",x[v[i]]-x[u[i]]);
}
}
参考资料
分类:
trick / 倍增取模
, 数据结构 / 倍增思想
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!