abc 267 f 题解
abc 267 f
题意#
给定一个有
树上的两个结点
给定 -1
。
思路#
在线#
首先,我们先思考这样一个问题,在什么情况下,不存在与点
当从
而我们可以想到最长路这件事,就可以联想到树的直径。
令从
可以证明,
所以,我们可以画一个这样的图:
也就是说,如果我们要求与
代码#
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, q, d, id[2], fa[2][20][N];
vector<int> g[N];
void dfs(int t, int f, int dis, int p) {
if (dis > d) {
d = dis, id[p] = t;
}
if (p >= 2) {
fa[p % 2][0][t] = f;
}
for (int i : g[t]) {
if (i != f) {
dfs(i, t, dis + 1, p);
}
}
}
void get_fa() {
for (int i = 0; i < 2; i++) {
for (int j = 1; j < 20; j++) {
for (int k = 1; k <= n; k++) {
fa[i][j][k] = fa[i][j - 1][fa[i][j - 1][k]];
}
}
}
}
int Find(int u, int k, bool p) {
for (int i = 0; i < 20; i++, k >>= 1) {
if (k & 1) {
u = fa[p][i][u];
}
}
return u;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1, a, b; i < n; i++) {
cin >> a >> b;
g[a].push_back(b), g[b].push_back(a);
}
dfs(1, 0, 0, 0), d = 0, dfs(id[0], 0, 0, 1);
dfs(id[0], 0, 0, 2), dfs(id[1], 0, 0, 3), get_fa();
cin >> q;
while (q--) {
int u, k;
cin >> u >> k;
int s = max(Find(u, k, 0), Find(u, k, 1));
cout << (!s ? -1 : s) << '\n';
}
return 0;
}
离线#
我们可以把每个点
代码#
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int N = 2e5 + 10;
int n, q, d, id[2], ans[N];
vector<int> g[N];
vector<pii> pos[N];
int top, stk[N];
void dfs(int t, int f, int dis, int p) {
if (dis > d) {
d = dis, id[p] = t;
}
for (int i : g[t]) {
if (i != f) {
dfs(i, t, dis + 1, p);
}
}
}
void _dfs(int t, int fa) {
stk[++top] = t;
for (int i : g[t]) {
if (i != fa) {
_dfs(i, t);
}
}
for (auto [i, j] : pos[t]) {
if (top > i) {
ans[j] = stk[top - i];
}
}
top--;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1, a, b; i < n; i++) {
cin >> a >> b;
g[a].push_back(b), g[b].push_back(a);
}
dfs(1, 0, 0, 0), d = 0, dfs(id[0], 0, 0, 1);
cin >> q;
for (int i = 1, u, k; i <= q; i++) {
cin >> u >> k, ans[i] = -1;
pos[u].push_back({k, i});
}
_dfs(id[0], 0), _dfs(id[1], 1);
for (int i = 1; i <= q; i++) {
cout << ans[i] << '\n';
}
return 0;
}
作者:cn
出处:https://www.cnblogs.com/chengning0909/p/17400258.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现