首先我们考虑两种肯定碰不到的情况:1.a, b 的LCA的深度都比c, d 大。2.c, d 的LCA的深度都比a, b大。
那么我们考虑剩下的情况:设 l1 = lca(a, b), l2 = lca(c, d)。
1.如果deep[l1] >= deep[l2]:那么只要c或d到根的路径上有l1,就能碰到。
2.如果deep[l2] >= deep[l1]:那么只要a或b到根的路径上有l2,就能碰到。
上面的操作再求几遍LCA就行。

1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cctype> 8 #include<vector> 9 #include<stack> 10 #include<queue> 11 using namespace std; 12 #define enter puts("") 13 #define space putchar(' ') 14 #define Mem(a, x) memset(a, x, sizeof(a)) 15 #define rg register 16 typedef long long ll; 17 typedef double db; 18 const int INF = 0x3f3f3f3f; 19 const db eps = 1e-8; 20 const int maxn = 1e5 + 5; 21 inline ll read() 22 { 23 ll ans = 0; 24 char ch = getchar(), last = ' '; 25 while(!isdigit(ch)) {last = ch; ch = getchar();} 26 while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();} 27 if(last == '-') ans = -ans; 28 return ans; 29 } 30 inline void write(ll x) 31 { 32 if(x < 0) x = -x, putchar('-'); 33 if(x >= 10) write(x / 10); 34 putchar(x % 10 + '0'); 35 } 36 37 int n, q; 38 vector<int> v[maxn]; 39 40 bool vis[maxn]; 41 int dep[maxn], dp[maxn][22]; 42 void dfs(int now) 43 { 44 vis[now] = 1; 45 for(int i = 1; (1 << i) <= dep[now]; ++i) 46 dp[now][i] = dp[dp[now][i - 1]][i - 1]; 47 for(int i = 0; i < (int)v[now].size(); ++i) 48 { 49 if(!vis[v[now][i]]) 50 { 51 dep[v[now][i]] = dep[now] + 1; 52 dp[v[now][i]][0] = now; 53 dfs(v[now][i]); 54 } 55 } 56 } 57 58 int lca(int x, int y) 59 { 60 if(dep[x] < dep[y]) swap(x, y); 61 for(int i = 20; i >= 0; --i) 62 if(dep[x] - (1 << i) >= dep[y]) x = dp[x][i]; 63 if(x == y) return x; 64 for(int i = 20; i >= 0; --i) 65 if(dp[x][i] != dp[y][i]) x = dp[x][i], y = dp[y][i]; 66 return dp[x][0]; 67 } 68 69 int main() 70 { 71 n = read(); q = read(); 72 for(int i = 1; i < n; ++i) 73 { 74 int x = read(), y = read(); 75 v[x].push_back(y); v[y].push_back(x); 76 } 77 Mem(dp, 0);dfs(1); 78 for(int i = 1; i <= q; ++i) 79 { 80 int a = read(), b = read(), c = read(), d = read(); 81 int l1 = lca(a, b), l2 = lca(c, d); 82 if(dep[l1] > dep[c] && dep[l1] > dep[d]) printf("N "); 83 else if(dep[l2] > dep[a] && dep[l2] > dep[b]) printf("N "); 84 else if(dep[l1] >= dep[l2]) 85 { 86 if(lca(l1, d) == l1 || lca(l1, c) == l1) printf("Y "); 87 else printf("N "); 88 } 89 else 90 { 91 if(lca(l2, a) == l2 || lca(l2, b) == l2) printf("Y "); 92 else printf("N "); 93 } 94 } 95 return 0; 96 }