Rentib

Untitled

Feb 10th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int> G[250007]; //graf
  4. vector<int> ET; //wszystkie droga dfsa
  5. int preorder[250007], nr, normal_order[250007];
  6. int pierwsze_pojawienie[250007];
  7. void DFS(int v){
  8.   preorder[v] = ++nr;
  9.   normal_order[nr] = v;
  10.   pierwsze_pojawienie[v] = ET.size();
  11.   ET.push_back(v);
  12.   for(auto i : G[v])
  13.     if(preorder[i] == 0){
  14.       DFS(i);
  15.       ET.push_back(v);
  16.     }
  17. }
  18.  
  19. int tree[1 << 20], baza_drzewa = 1;
  20. void build(){ //buduj drzewo
  21.   while(baza_drzewa <= ET.size()) baza_drzewa *= 2;
  22.  
  23.   for(int i = 0;i < ET.size();i++)
  24.     tree[i + baza_drzewa] = ET[i];
  25.   for(int i = baza_drzewa + ET.size();i < baza_drzewa * 2;i++)
  26.     tree[i] = INT_MAX;
  27.  
  28.   for(int i = baza_drzewa - 1;i > 0;i--)
  29.     tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
  30. }
  31.  
  32. int LCA(int p, int k){
  33.   p = pierwsze_pojawienie[p] + baza_drzewa;
  34.   k = pierwsze_pojawienie[k] + baza_drzewa;
  35.   int wynik = INT_MAX; // minimalna wartość
  36.   //znajdz minimalną wartość ET na przedziale od p do k
  37.   while(p <= k && p > 0 && k > 0){
  38.     if(p % 2 == 1) wynik = min(wynik, tree[p++]);
  39.     if(k % 2 == 0) wynik = min(wynik, tree[k--]);
  40.     p /= 2;
  41.     k /= 2;
  42.   }
  43.   return normal_order[wynik];
  44. }
  45.  
  46. int main(){
  47.   int n, m, a, b;
  48.   cin >> n;
  49.   for(int i = 1;i < n;i++){
  50.     cin >> a >> b;
  51.     G[a].push_back(b);
  52.     G[b].push_back(a);
  53.   }
  54.   DFS(1);
  55.   build(); //zrób drzewo
  56.   //for(int i = baza_drzewa;i < baza_drzewa * 2;i++)
  57.     //cout << tree[i] << ' ';
  58.   for(cin >> m;m > 0;m--){
  59.     cin >> a >> b;
  60.     cout << LCA(a, b) << '\n';
  61.   }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment