-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy path3559.cpp
More file actions
72 lines (72 loc) · 2.02 KB
/
Copy path3559.cpp
File metadata and controls
72 lines (72 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const int MAXN = 1e5 + 6;
const int LOGN = 17;
class Solution {
public:
vector<pair<int, int>> adj[MAXN];
int up[MAXN][LOGN + 1];
int depth[MAXN];
int distRoot[MAXN];
void dfs(int curr, int parent) {
up[curr][0] = parent;
for (auto& [v, w] : adj[curr]) {
if (v != parent) {
depth[v] = depth[curr] + 1;
distRoot[v] = distRoot[curr] + w;
dfs(v, curr);
}
}
}
int lca(int a, int b) {
if (depth[a] < depth[b]) swap(a, b);
int diff = depth[a] - depth[b];
for (int k = 0; k <= LOGN; ++k) {
if (diff & (1 << k)) {
a = up[a][k];
}
}
if (a == b) return a;
for (int k = LOGN; k >= 0; --k) {
if (up[a][k] != up[b][k]) {
a = up[a][k];
b = up[b][k];
}
}
return up[a][0];
}
int dist(int a, int b) {
int c = lca(a, b);
return distRoot[a] + distRoot[b] - 2 * distRoot[c];
}
vector<int> assignEdgeWeights(vector<vector<int>>& edges, vector<vector<int>>& queries) {
int n = edges.size() + 1;
for (auto& edge : edges) {
int u = edge[0];
int v = edge[1];
int w = 1;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
depth[1] = 0;
distRoot[1] = 0;
dfs(1, 1);
for (int k = 1; k <= LOGN; ++k) {
for (int i = 1; i <= n; ++i) {
up[i][k] = up[up[i][k - 1]][k - 1];
}
}
vector<int> power(1e5 + 1, 0);
int mod = 1e9 + 7;
power[0] = 1;
for (int i = 1; i <= 1e5; ++i) {
power[i] = power[i - 1] * 2;
power[i] %= mod;
}
vector<int> res;
for (auto& query : queries) {
int d = dist(query[0], query[1]);
if (d == 0) res.push_back(0);
else res.push_back(power[d - 1]);
}
return res;
}
};