题目链接:https://ac.nowcoder.com/acm/problem/23482
题目大意:
思路:我们直接得到或者u-x y-v, u-y x-v。这些都可以通过LCA搞定。
#pragma GCC optimize(3, "Ofast", "inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define rint register int
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
char buf[1<<20],*p1=buf,*p2=buf;
inline int read() {
int f=0,fu=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-')
fu=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
f=(f<<3)+(f<<1)+c-48;
c=getchar();
}
return f*fu;
}
inline void print(LL x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x >= 10)
print(x / 10);
putchar(x % 10 + '0');
}
const int N = 300015;
struct Edge {
int to, nxt, val;
} edge[N << 1];
struct RMQ_lca {
LL w[N];
int head[N], etot;
int lg[N << 1], a[N << 1], dfn[N], dep[N], tot;
int f[N << 1][20];
void init(int n) {
etot=tot=0;
memset(head, 0, sizeof(head[0])*(n+5));
memset(w, 0, sizeof(w[0])*(n+5));
}
void add(int u, int v, int w) {
edge[++etot] = {v, head[u], w};
head[u] = etot;
}
void dfs(int u, int fa) {
f[++tot][0] = u, dfn[u] = tot, dep[u] = dep[fa] + 1;
for(rint i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa)
continue;
w[v] = w[u] + edge[i].val;
dfs(v, u);
f[++tot][0] = u;
}
}
void pre() {
lg[1] = 0;
for (rint i = 2; i <= tot; i++)
lg[i] = lg[i >> 1] + 1;
for (rint j = 1; j <= 19; j++) {
for (rint i = 1; i + (1 << j) - 1 <= tot; i++) {
if (dep[f[i][j - 1]] < dep[f[i + (1 << j - 1)][j - 1]]) {
f[i][j] = f[i][j - 1];
} else {
f[i][j] = f[i + (1 << j - 1)][j - 1];
}
}
}
}
int LCA(int u, int v) {
u = dfn[u], v = dfn[v];
if (u > v)
swap(u, v);
int len = lg[v - u + 1];
if (dep[f[u][len]] < dep[f[v - (1 << len) + 1][len]]) {
return f[u][len];
} else {
return f[v - (1 << len) + 1][len];
}
}
LL dist(int u, int v) {
return w[u] + w[v] - 2ll * w[LCA(u, v)];
}
} lca;
int main() {
int n=read();
lca.init(n);
for(int i=1; i<=n-1; i++) {
int u = read(), v = read(), w = 1;
lca.add(u, v, w), lca.add(v, u, w);
}
int x=read(), y=read();
lca.dfs(1, 0);
lca.pre();
int q=read();
while (q--) {
int l = read(), r = read();
int d=lca.dist(l, r);
int d1=lca.dist(l, x)+lca.dist(y, r);
int d2=lca.dist(l, y)+lca.dist(x, r);
d=min(d, min(d1, d2));
print(d);
printf("\n");
}
return 0;
}

京公网安备 11010502036488号