Skip to content

Commit e66ab79

Browse files
authored
Create 2277.Closest-Node-to-Path-in-Tree_v2.cpp
1 parent 4c376e6 commit e66ab79

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using ll = long long;
2+
const int MAXN = 100000;
3+
const int LOGN = 17;
4+
class Solution {
5+
public:
6+
vector<pair<int,int>> adj[MAXN];
7+
int up[MAXN][LOGN+1];
8+
int depth[MAXN];
9+
ll distRoot[MAXN];
10+
11+
void dfs(int cur, int parent)
12+
{
13+
up[cur][0] = parent;
14+
for(auto &[v,w]: adj[cur])
15+
{
16+
if(v == parent) continue;
17+
depth[v] = depth[cur] + 1;
18+
distRoot[v] = distRoot[cur] + w;
19+
dfs(v, cur);
20+
}
21+
}
22+
23+
int lca(int a, int b)
24+
{
25+
if(depth[a] < depth[b]) swap(a,b);
26+
int diff = depth[a] - depth[b];
27+
for(int k = 0; k <= LOGN; k++){
28+
if(diff & (1<<k)) a = up[a][k];
29+
}
30+
if(a == b) return a;
31+
for(int k = LOGN; k >= 0; k--){
32+
if(up[a][k] != up[b][k]){
33+
a = up[a][k];
34+
b = up[b][k];
35+
}
36+
}
37+
return up[a][0];
38+
}
39+
40+
ll dist(int a, int b)
41+
{
42+
int c = lca(a,b);
43+
return distRoot[a] + distRoot[b] - 2*distRoot[c];
44+
}
45+
46+
ll stepUp(int u, int k) {
47+
for (int i=LOGN; i>=0; i--) {
48+
if ((k>>i)&1) {
49+
u = up[u][i];
50+
}
51+
}
52+
return u;
53+
}
54+
55+
vector<int> closestNode(int n, vector<vector<int>>& edges, vector<vector<int>>& query) {
56+
for (auto& edge: edges)
57+
{
58+
int u = edge[0], v = edge[1];
59+
adj[u].push_back({v,1});
60+
adj[v].push_back({u,1});
61+
}
62+
63+
depth[0] = 0;
64+
distRoot[0] = 0;
65+
dfs(0, 0);
66+
67+
vector<int>rets;
68+
for(int k = 1; k <= LOGN; k++) {
69+
for(int v = 0; v < n; v++) {
70+
up[v][k] = up[up[v][k-1]][k-1];
71+
}
72+
}
73+
74+
for (auto&q: query) {
75+
int u = q[0], v = q[1], k = q[2];
76+
vector<pair<int,int>>ans;
77+
int uv = lca(u,v);
78+
int uk = lca(u,k);
79+
int vk = lca(v,k);
80+
ans.push_back({depth[uv], uv});
81+
ans.push_back({depth[uk], uk});
82+
ans.push_back({depth[vk], vk});
83+
sort(ans.rbegin(), ans.rend());
84+
85+
rets.push_back(ans[0].second);
86+
}
87+
88+
return rets;
89+
}
90+
};

0 commit comments

Comments
 (0)