Tuesday, November 5, 2019

[Codeforces] A. Connect and Disconnect

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : A. Connect and Disconnect
Source            : Codeforces
Category          : Data Structure
Algorithm         : Dynamic Connectivity
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define pii             pair <int, int>  
  6. #define mk              make_pair  
  7.   
  8. static const int maxn = 3e5 + 5;  
  9.   
  10. vector <pii> Tree[maxn * 4];  
  11.   
  12. void update(int node, int a, int b, int i, int j, pii p)  
  13. {  
  14.       if (a > j or b < i) return;  
  15.       if (a >= i and b <= j) return void(Tree[node].push_back(p));  
  16.       int lchild = node * 2;  
  17.       int rchild = lchild + 1;  
  18.       int mid = (a + b) / 2;  
  19.       update(lchild, a, mid, i, j, p);  
  20.       update(rchild, mid + 1, b, i, j, p);  
  21. }  
  22.   
  23. int par[maxn];  
  24. int sz[maxn];  
  25. stack <int> st;  
  26. int component;  
  27.   
  28. void makeSet()  
  29. {  
  30.       for (int i = 1; i < maxn; i++)  
  31.       {  
  32.             par[i] = i;  
  33.             sz[i] = 1;  
  34.       }  
  35. }  
  36.   
  37. int findRep(int r)  
  38. {  
  39.       if (r == par[r]) return r;  
  40.       return findRep(par[r]);  
  41. }  
  42.   
  43. void marge(int u, int v)  
  44. {  
  45.       int p = findRep(u);  
  46.       int q = findRep(v);  
  47.       if (p == q) return;  
  48.       component--;  
  49.       if (sz[p] > sz[q]) swap(p, q);  
  50.       par[p] = q;  
  51.       sz[q] += sz[p];  
  52.       st.push(p);  
  53. }  
  54.   
  55. void rollback(int moment)  
  56. {  
  57.       while (st.size() > moment)  
  58.       {  
  59.             int curr = st.top(); st.pop();  
  60.             sz[ par[curr] ] -= sz[curr];  
  61.             par[curr] = curr;  
  62.             ++component;  
  63.       }  
  64. }  
  65.   
  66. int ans[maxn];  
  67.   
  68. void dfs(int node, int a, int b)  
  69. {  
  70.       if (a > b) return;  
  71.       int moment = st.size();  
  72.       for (pii p : Tree[node]) marge(p.first, p.second);  
  73.       if (a == b)  
  74.       {  
  75.             ans[a] = component;  
  76.       }  
  77.       else  
  78.       {  
  79.             int lchild = node * 2;  
  80.             int rchild = lchild + 1;  
  81.             int mid = (a + b) / 2;  
  82.             dfs(lchild, a, mid);  
  83.             dfs(rchild, mid + 1, b);  
  84.       }  
  85.       rollback(moment);  
  86. }  
  87.   
  88. map <pii, int> in;  
  89. vector <int> queries;  
  90.   
  91. signed main()  
  92. {  
  93.       ios_base::sync_with_stdio(false);  
  94.       cin.tie(nullptr);  
  95.       cout.tie(nullptr);  
  96.   
  97.       #ifndef ONLINE_JUDGE  
  98.             freopen("in.txt""r", stdin);  
  99.       #endif // ONLINE_JUDGE  
  100.   
  101.       freopen("connect.in""r", stdin);  
  102.       freopen("connect.out""w", stdout);  
  103.   
  104.       int n, q;  
  105.       cin >> n >> q;  
  106.       for (int i = 1; i <= q; i++)  
  107.       {  
  108.             string type;  
  109.             cin >> type;  
  110.             if (type == "?")  
  111.             {  
  112.                   queries.push_back(i);  
  113.             }  
  114.             else  
  115.             {  
  116.                   int a, b;  
  117.                   cin >> a >> b;  
  118.                   if (a > b) swap(a, b);  
  119.                   if (type == "+")  
  120.                   {  
  121.                         in[mk(a, b)] = i;  
  122.                   }  
  123.                   else  
  124.                   {  
  125.                         int l = in[mk(a, b)];  
  126.                         int r = i - 1;  
  127.                         update(1, 1, q, l, r, mk(a, b));  
  128.                         in.erase(mk(a, b));  
  129.                   }  
  130.             }  
  131.       }  
  132.       for (auto it : in)  
  133.       {  
  134.             int l = it.second;  
  135.             int r = q;  
  136.             int a = it.first.first;  
  137.             int b = it.first.second;  
  138.             update(1, 1, q, l, r, mk(a, b));  
  139.       }  
  140.       makeSet();  
  141.       component = n;  
  142.       dfs(1, 1, q);  
  143.       for (int p : queries) cout << ans[p] << '\n';  
  144. }  

No comments:

Post a Comment

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