DuongNhi99

FSELECT - LCA

Jan 18th, 2022 (edited)
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5. using pii = pair<int, int>;
  6. using tpii = tuple<int, int, int>;
  7.  
  8. const int maxN = 2e5 + 5;
  9. const int INF = 1e9 + 7;
  10. const int MOD = 1e9 + 7;
  11.  
  12. int n, k, l;
  13. int root;
  14. vector<int> graph[maxN], meet[maxN / 2];
  15.  
  16. int height[maxN];
  17. int par[maxN][20];
  18.  
  19. void DFS(int u, int p) {
  20.     par[u][0] = p;
  21.  
  22.     for (int v : graph[u]) {
  23.         if (v == p) continue;
  24.  
  25.         height[v] = height[u] + 1;
  26.         DFS(v, u);
  27.     }
  28. }
  29.  
  30. void build_LCA() {
  31.     l = log2(n);
  32.  
  33.     DFS(root, 0);
  34.     for (int i = 1; i <= l; i++)
  35.         for (int u = 1; u <= n; u++)
  36.             par[u][i] = par[par[u][i - 1]][i - 1];
  37. }
  38.  
  39. int LCA(int u, int v) {
  40.     if (height[u] < height[v]) swap(u, v);
  41.  
  42.     for (int i = l; i >= 0; i--)
  43.         if (height[u] - (1 << i) >= height[v])
  44.             u = par[u][i];
  45.  
  46.     if (u == v) return u;
  47.  
  48.     for (int i = l;  i >= 0; i--)
  49.         if (par[u][i] && par[u][i] != par[v][i])
  50.             u = par[u][i], v = par[v][i];
  51.     return par[u][0];
  52. }
  53.  
  54. int solve(vector<int> meet) {
  55.     int x = meet[0], u;
  56.  
  57.     int maxD = 0;
  58.     for (int i = 1; i < meet.size(); i++) {
  59.         int y = meet[i];
  60.         int dx = height[x] + height[y] - 2*height[LCA(x, y)];
  61.         if (dx > maxD) maxD = dx, u = y;
  62.     }
  63.  
  64.     int ans = 0;
  65.     for (int i = 0; i < meet.size(); i++) {
  66.         int v = meet[i];
  67.         int du = height[u] + height[v] - 2*height[LCA(u, v)];
  68.         ans = max(ans, du);
  69.     }
  70.     return ans;
  71. }
  72.  
  73. int main() {
  74. #ifdef LOCAL
  75.     freopen("in1.txt", "r", stdin);
  76. #else
  77.     freopen("FSELECT.inp", "r", stdin);
  78.     freopen("FSELECT.out", "w", stdout);
  79. #endif
  80.     ios_base::sync_with_stdio(false);
  81.     cin.tie(nullptr);
  82.  
  83.     cin >> n >> k;
  84.     for (int i = 1; i <= n; ++i) {
  85.         int x; cin >> x >> par[i][0];
  86.         graph[par[i][0]].push_back(i);
  87.         meet[x].push_back(i);
  88.  
  89.         if (par[i][0] == 0) root = i;
  90.     }
  91.  
  92.     l = log2(n);
  93.     build_LCA();
  94.     for (int i = 1; i <= k; i++)
  95.         cout << solve(meet[i]) << '\n';
  96.  
  97.     return 0;
  98. }
  99.  
Add Comment
Please, Sign In to add comment