0pts 求助
查看原帖
0pts 求助
912750
CarrotMeow楼主2024/3/31 14:45

样例 #2 都过不了 /kk 条疯了 /kk

#include <bits/stdc++.h>
#define int int64_t
using namespace std;

const int N = 1e5 + 10;
int n, u, fa[N][22], d[N], q, m, a[N], p[N];
vector<int> tr[N];

void dfs(int u, int fa) {
	for (int i : tr[u]) 
		if (i != fa) {
			d[i] = d[u] + 1;
			p[i] = max(p[u], i);
			::fa[i][0] = u;
			dfs(i, u);
		}
}

int lca(int u, int v) {
	if (d[u] < d[v]) swap(u, v);
	for (int i = 18; ~i; i--)
		if (d[fa[u][i]] >= d[v])
			u = fa[u][i];
	if (u == v) return u;
	for (int i = 18; ~i; i--)
		if (fa[u][i] != fa[v][i])
			u = fa[u][i], v = fa[v][i];
	return fa[u][0];
}

void solve() {
	cin >> m;
	for (int i = 1; i <= m; i++)
		cin >> a[i];
	int res = a[1];
	for (int i = 2; i <= m; i++)
//		cout << res << ' ',
		res = lca(res, a[i]);
	cout << p[res] << '\n';
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> n;
	for (int i = 1; i < n; i++) {
		cin >> u;
		tr[u].push_back(i);
		tr[i].push_back(u);
	}
	for (int i = 1; i <= 18; i++)
		for (int j = 1; j <= n; j++)
			fa[j][i] = fa[fa[j][i - 1]][i - 1]; // init
	dfs(0, -1);
	cin >> q;
	while (q--) solve();
}
2024/3/31 14:45
加载中...