CF1304E 1-Trees and Queries(lca + 树上前缀和 + 奇偶性)
二话不说,直接按题意模拟暴搜,当然
不过,在模拟的过程中,我在链式前向星的删边中居然一开始错了,还是要 mark 一下以后注意。
void del(int x, int pre) { e[top].to = e[top].next = 0; h[x] = pre; // h[x] = 0; < --- tip } int main() { int pre_x = h[x], pre_y = h[y]; del(x, pre_x); del(y, pre_y); }
这题主要是要想到在树上,从
想到之后证明是显然的,所谓的更长路径其实就是在简单路径上多走了一些重复的边,一条边重复走一次来回就对答案有两次贡献,也就是
这样就有思路了,先分类讨论。
- 不走
也就是在原树上跑,显然与
显然,如果
如果
所以想到 若存在可行路径一定要保证
考虑
而若
也就是说,若存在可行路径,则
这样,
- 走
思路是一样的,同样求出
而只加了一条边,贡献直接可以得到为 1,也就是求两边的 lca 即可:
不过要注意的是,加的是无向边,所以要对于走一条边,要分成
复杂度是
#include <bits/stdc++.h> #define re register int using namespace std; const int N = 1e5 + 10, logN = 50; struct edge { int to, next; }e[N << 1]; int top, h[N], dep[N], st[N][logN], logn; int n, q; void add(int x, int y) { e[++ top] = (edge){y, h[x]}; h[x] = top; } void dfs(int x, int fa) { dep[x] = dep[fa] + 1; st[x][0] = fa; for (re i = 1; i <= logn; i ++) st[x][i] = st[st[x][i - 1]][i - 1]; for (re i = h[x]; i; i = e[i].next) { int y = e[i].to; if (y == fa) continue; dfs(y, x); } } int lca(int x, int y) { if (dep[x] < dep[y]) swap(x, y); for (re i = logn; ~ i; i --) if (dep[st[x][i]] >= dep[y]) x = st[x][i]; if (x == y) return y; for (re i = logn; ~ i; i --) if (st[x][i] != st[y][i]) x = st[x][i], y = st[y][i]; return st[x][0]; } int work(int x, int y) { int p = lca(x, y); return dep[x] + dep[y] - (dep[p] << 1); } bool check(int x, int y) { return (x <= y && x % 2 == y % 2 ? true : false); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; logn = log2(n); for (re i = 1; i < n; i ++) { int x, y; cin >> x >> y; add(x, y); add(y, x); } dfs(1, 0); cin >> q; while (q --) { int x, y, a, b, k; cin >> x >> y >> a >> b >> k; int dis1 = work(a, b); int dis2 = work(a, x) + 1 + work(y, b); int dis3 = work(a, y) + 1 + work(x, b); if (check(dis1, k) || check(dis2, k) || check(dis3, k)) cout << "YES\n"; else cout << "NO\n"; } return 0; }
分类:
C 图论 - 最近公共祖先 LCA
, W 思维 / 性质题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具