求助LCA wa0pts
  • 板块灌水区
  • 楼主code_dbtz
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/10/17 13:48
  • 上次更新2025/2/3 17:12:24
查看原帖
求助LCA wa0pts
1121772
code_dbtz楼主2024/10/17 13:48

模板题
rt,我的代码:

#include <bits/stdc++.h>
#define uint unsigned long long
#define sint long long
using namespace std;
struct node{
	int depth;
	vector <int> childrenPoses;
	int fatherPos[25];
} tree[200005];
void buildTree(int rootPos){
	queue <pair <int, int> > q;
	q.push({rootPos, 1});
	tree[rootPos].depth = 1;
	while(q.size()){
		const int prePos = q.front().first, preDepth = q.front().second;
		q.pop();
		for(int i = 0; i < tree[prePos].childrenPoses.size(); i++){
			q.push({tree[prePos].childrenPoses[i], preDepth + 1});
			tree[tree[prePos].childrenPoses[i]].depth = preDepth + 1;
		}
	}
}
int k_father(int pos, int k){
	int presentPos = pos;
	for(int i = 0; i < 25; i++){
		if(k & (1 << i)) presentPos = tree[presentPos].fatherPos[i];
	}
	return presentPos;
}
int query(int pos1, int pos2){
	if(tree[pos1].depth > tree[pos2].depth){
		pos1 = k_father(pos1, tree[pos1].depth - tree[pos2].depth);
	}
	else if(tree[pos1].depth < tree[pos2].depth){
		pos2 = k_father(pos2, tree[pos2].depth - tree[pos1].depth);
	}
	int leftLevel = 0, rightLevel = tree[pos1].depth, result = -1;
	while(leftLevel <= rightLevel){
		const int midLevel = (leftLevel + rightLevel) >> 1;
		const int root1 = k_father(pos1, midLevel), root2 = k_father(pos2, midLevel);
		if(root1 == root2){
			if(root1) result = root1;
			rightLevel = midLevel - 1;
		}
		else{
			leftLevel = midLevel + 1;
		}
	}
	return result;
}
int main()
{

	int numNode, numQuery, rootPos;
	scanf("%d %d %d", &numNode, &numQuery, &rootPos);
	for(int i = 0; i < numNode - 1; i++){
		int child, father;
		scanf("%d %d", &child, &father);
		tree[child].fatherPos[0] = father;
		tree[father].childrenPoses.push_back(child);
	}
	buildTree(rootPos);
	for(int i = 1; i <= numNode; i++){
		for(int j = 1; j < 25; j++){
			tree[i].fatherPos[j] = tree[tree[i].fatherPos[j - 1]].fatherPos[j - 1];
		}
	}
	for(int i = 0; i < numQuery; i++){
		int pos1, pos2;
		scanf("%d %d", &pos1, &pos2);
		printf("%d\n", query(pos1, pos2));
	}
	return 0;
}
2024/10/17 13:48
加载中...