b) 若 x 为 mx1 的祖先节点 ,例如 x 为 2 分别对 mx 和 mx1 求 LCA ,LCA(x, mx) = fa LCA(x, mx1) = x,
代码
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
#define ll long long
#define IO ios::sync_with_stdio(0);cin.tie(0)
#define rep(i,a,n) for (ll i=a;i<=n;i++)
#define per(i,a,n) for (ll i=a;i>=n;i--)
#define fi first
#define se second
const int N = 2e5 + 10, M = 2 * N;
using namespace std;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define deb(i,x) if(int i==x) int k = 1;
#define pb push_back
#define all(x) x.begin(),x.end()
ll lowbit(ll x) { return x & -x; }
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll qmi(ll a, ll b, ll mod) {
ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; }
return res;
}
vector<int> e[N];
int depth[N] = { 0 };
int p[N][30] = { 0 };
void dfs(int u, int fa)
{
p[u][0] = fa;
for (int i = 1; (1 << i) <= depth[u]; i++)
{
p[u][i] = p[p[u][i - 1]][i - 1];
}
for (auto x : e[u])
{
if (x != fa)
dfs(x, u);
}
}
int lca(int a, int b)
{
if (depth[a] < depth[b])swap(a, b);
int t = 25;
while (depth[a] > depth[b])
{
if (depth[a] - depth[b] >= (1 << t))
a = p[a][t];
t--;
}
if (a == b)return a;
for (int k = 25; k >= 0; k--)
{
if (p[a][k] != p[b][k])
a = p[a][k], b = p[b][k];
}
return p[a][0];
}
set<int> s;
bool solve(int mx, int mx1)
{
bool f = true;
int fa = lca(mx, mx1);
for (auto x : s)
{
bool k1 = lca(x, mx1) == fa && lca(x, mx) == x;
bool k2 = lca(x, mx1) == x && lca(x, mx) == fa;
if (!(k1 || k2))
{
f = false;
break;
}
}
return f;
}
void get_dep(int u, int p, int dep)
{
depth[u] = dep;
for (auto x : e[u])
{
if (x == p)continue;
get_dep(x, u, dep + 1);
}
}
int main()
{
IO;
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int n; cin >> n;
for (int i = 1; i < n; i++)
{
int u, v; cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
int q; cin >> q;
get_dep(1, 0, 1);
dfs(1, 1);
while (q--)
{
int k; cin >> k;
s.clear();
int mx = 0, mx1 = 0;
rep(i, 1, k)
{
int x; cin >> x;
if (depth[x] > depth[mx])
mx = x;
s.insert(x);
}
for (auto x : s)
{
if (depth[x] > depth[mx1] && lca(x, mx) != x)
{
mx1 = x;
}
}
if (solve(mx, mx1))cout << "YES\n";
else cout << "NO\n";
}
return 0;
}