sb 代码求条
  • 板块灌水区
  • 楼主I_Love_DS
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/10/25 20:50
  • 上次更新2024/10/25 21:25:38
查看原帖
sb 代码求条
1118614
I_Love_DS楼主2024/10/25 20:50
#include <bits/stdc++.h>

using namespace std;

const int N = 1e3 + 50;

int n, m;
vector <int> e[N];
int d[N];
int f[20][N];

inline void dfs(int u) {
	for (auto v : e[u]) {
		d[v] = d[u] + 1;
		dfs(v);
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 2; i <= n; i++) {
		int x;
		scanf("%d", &x);
		e[x].push_back(i);
		f[0][i] = x;
	}
	d[1] = 1;
	dfs(1);
	for (int i = 1; i <= n; i++) cerr << d[i] << endl; // 
	for (int i = 1; i <= 20; i++) 
		for (int j = 1; j <= n; j++) 
			f[i][j] = f[i - 1][f[i - 1][j]];
	for (int i = 1; i <= n; i++) cerr << d[i] << endl; // 两处输出竟然不一样?
	return 0;
	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		if (d[x] < d[y]) swap(x, y);
		int c = d[x] - d[y];
		cerr << d[x] << " " << d[y] << " ";
		for (int i = 0; c; i++) 
			if (c & (1 << i)) 
				x = f[i][x], c -= 1 << i;
		cerr << c << " " << x << " " << y << endl;
		if (x == y) {
			printf("%d\n", x);
			continue;
		}
		for (int i = 20; i >= 0; i--) 
			if (f[i][x] != f[i][y]) 
				x = f[i][x], y = f[i][y];
		printf("%d\n", f[0][x]);
	}
	return 0;
}
2024/10/25 20:50
加载中...