CodeForces 1844G Tree Weights
出题人脑洞真大……
设 为 到 的距离。我们知道 。发现每个方程有 个未知数,很烦。能不能消掉一个?
发现若整个方程模 ,。因此可以得知所有 二进制下最低位。再递归处理接下来的位。于是我们发现 若有解则一定是唯一确定的。
预处理出 ,时间复杂度 。
code
// Problem: G. Tree Weights // Contest: Codeforces - Codeforces Round 884 (Div. 1 + Div. 2) // URL: https://codeforces.com/contest/1844/problem/G // Memory Limit: 256 MB // Time Limit: 5000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 100100; ll n, a[maxn], b[maxn], c[maxn], d[maxn], ans[maxn]; vector<pii> G[maxn]; int fa[maxn], sz[maxn], son[maxn], dep[maxn], top[maxn]; bool vis[maxn]; int dfs(int u, int f, int d) { fa[u] = f; sz[u] = 1; dep[u] = d; int maxson = -1; for (pii p : G[u]) { int v = p.fst; if (v == f) { continue; } sz[u] += dfs(v, u, d + 1); if (sz[v] > maxson) { son[u] = v; maxson = sz[v]; } } return sz[u]; } void dfs2(int u, int tp) { top[u] = tp; vis[u] = 1; if (!son[u]) { return; } dfs2(son[u], tp); for (pii p : G[u]) { int v = p.fst; if (!vis[v]) { dfs2(v, v); } } } inline int qlca(int x, int y) { while (top[x] != top[y]) { if (dep[top[x]] < dep[top[y]]) { swap(x, y); } x = fa[top[x]]; } if (dep[x] > dep[y]) { swap(x, y); } return x; } void dfs3(int u, int fa) { for (pii p : G[u]) { int v = p.fst, id = p.scd; if (v == fa) { continue; } ans[id] = a[v] - a[u]; if (ans[id] <= 0) { puts("-1"); exit(0); } dfs3(v, u); } } void solve() { scanf("%lld", &n); for (int i = 1, u, v; i < n; ++i) { scanf("%d%d", &u, &v); G[u].pb(v, i); G[v].pb(u, i); } for (int i = 1; i < n; ++i) { scanf("%lld", &d[i]); } dfs(1, -1, 1); dfs2(1, 1); for (int i = 1; i < n; ++i) { b[i] = qlca(i, i + 1); } for (int k = 0; k < 60; ++k) { for (int i = 1; i < n; ++i) { ll t = d[i] - a[i] - a[i + 1] + a[b[i]] * 2; if (t < 0 || t % (1LL << k)) { puts("-1"); return; } t /= (1LL << k); t = (t % 2 + 2) % 2; c[i + 1] = ((t - c[i]) % 2 + 2) % 2; } for (int i = 2; i <= n; ++i) { if (c[i]) { a[i] |= (1LL << k); } } } dfs3(1, -1); for (int i = 1; i < n; ++i) { printf("%lld\n", ans[i]); } } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2022-07-16 洛谷 P4198 楼房重建
2022-07-16 CodeForces 1515E Phoenix and Computers
2022-07-16 CodeForces 1701E Text Editor