Friday, March 27, 2020

E - Xenia and Tree

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E - Xenia and Tree
Source            : Codeforces
Category          : Data Structure
Algorithm         : Square Root Decomposition on Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 1e5 + 6;  
  6. static const int logn = 19;  
  7. static const int maxb = 320;  
  8.   
  9. vector < vector <int> > graph;  
  10. int depth[maxn];  
  11. int father[maxn][logn];  
  12.   
  13. void dfs(int u = 1, int p = -1)  
  14. {  
  15.       for (int i = 1; i < logn; i++) father[u][i] = father[ father[u][i - 1] ][i - 1];  
  16.       for (int v : graph[u])  
  17.       {  
  18.             if (v == p) continue;  
  19.             depth[v] = depth[u] + 1;  
  20.             father[v][0] = u;  
  21.             dfs(v, u);  
  22.       }  
  23. }  
  24.   
  25. int find_lca(int u, int v)  
  26. {  
  27.       if (depth[u] < depth[v]) swap(u, v);  
  28.       for (int i = logn - 1; i >= 0; i--)  
  29.       {  
  30.             if (depth[ father[u][i] ] >= depth[v]) u = father[u][i];  
  31.       }  
  32.       if (u == v) return u;  
  33.       for (int i = logn - 1; i >= 0; i--)  
  34.       {  
  35.             if (father[u][i] != father[v][i])  
  36.             {  
  37.                   u = father[u][i];  
  38.                   v = father[v][i];  
  39.             }  
  40.       }  
  41.       return father[u][0];  
  42. }  
  43.   
  44. int dist[maxn];  
  45.   
  46. void bfs(vector <int> &block_reds)  
  47. {  
  48.       queue <int> pq;  
  49.       for (int x : block_reds)  
  50.       {  
  51.             pq.push(x);  
  52.             dist[x] = 0;  
  53.       }  
  54.       while (pq.size())  
  55.       {  
  56.             int u = pq.front();  
  57.             pq.pop();  
  58.             for (int v : graph[u])  
  59.             {  
  60.                   if (dist[v] > dist[u] + 1)  
  61.                   {  
  62.                         dist[v] = dist[u] + 1;  
  63.                         pq.push(v);  
  64.                   }  
  65.             }  
  66.       }  
  67. }  
  68.   
  69. signed main()  
  70. {  
  71.       ios_base::sync_with_stdio(false);  
  72.       cin.tie(nullptr);  
  73.   
  74.       #ifndef ONLINE_JUDGE  
  75.             freopen("in.txt""r", stdin);  
  76.       #endif // ONLINE_JUDGE  
  77.   
  78.       int n, m;  
  79.       cin >> n >> m;  
  80.       graph.resize(n + 1);  
  81.       for (int e = 1; e < n; e++)  
  82.       {  
  83.             int u, v;  
  84.             cin >> u >> v;  
  85.             graph[u].push_back(v);  
  86.             graph[v].push_back(u);  
  87.       }  
  88.       vector < pair <intint> > queries(m);  
  89.       for (int i = 0; i < m; i++) cin >> queries[i].first >> queries[i].second;  
  90.       depth[1] = 1;  
  91.       dfs();  
  92.       for (int i = 1; i <= n; i++) dist[i] = 1e9 + 9;  
  93.       vector <int> block_reds;  
  94.       block_reds.push_back(1);  
  95.       bfs(block_reds);  
  96.       for (int i = 0; i < m; i += maxb)  
  97.       {  
  98.             block_reds.clear();  
  99.             for (int j = 0; j < maxb; j++)  
  100.             {  
  101.                   int k = i + j;  
  102.                   if (k >= m) break;  
  103.                   if (queries[k].first == 1)  
  104.                   {  
  105.                         block_reds.push_back(queries[k].second);  
  106.                   }  
  107.                   else  
  108.                   {  
  109.                         int v = queries[k].second;  
  110.                         int min_dist = dist[v];  
  111.                         for (int u : block_reds)  
  112.                         {  
  113.                               int lca = find_lca(u, v);  
  114.                               int d = depth[u] + depth[v] - 2 * depth[lca];  
  115.                               min_dist = min(min_dist, d);  
  116.                         }  
  117.                         cout << min_dist << endl;  
  118.                   }  
  119.             }  
  120.             bfs(block_reds);  
  121.       }  
  122. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.