模板题
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;
}