Tuesday, November 5, 2019

[Codeforces] F. Bipartite Checking

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. Bipartite Checking
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. int dist[maxn];  
  26. bool bipertite;  
  27. stack <int> st;  
  28.   
  29. void makeSet()  
  30. {  
  31.       for (int i = 1; i < maxn; i++)  
  32.       {  
  33.             par[i] = i;  
  34.             sz[i] = 1;  
  35.             dist[i] = 0;  
  36.       }  
  37. }  
  38.   
  39. pii findRep(int r)  
  40. {  
  41.       int d = 0;  
  42.       while (par[r] != r)  
  43.       {  
  44.             d += dist[r];  
  45.             r = par[r];  
  46.       }  
  47.       return mk(r, d);  
  48. }  
  49.   
  50. void marge(int u, int v)  
  51. {  
  52.       if (bipertite == falsereturn;  
  53.       pii p = findRep(u);  
  54.       pii q = findRep(v);  
  55.       if (p.first == q.first)  
  56.       {  
  57.             int d = p.second + q.second;  
  58.             if (d % 2 == 0)  
  59.             {  
  60.                   bipertite = false;  
  61.                   st.push(-1);  
  62.             }  
  63.       }  
  64.       else  
  65.       {  
  66.             int x = p.first;  
  67.             int y = q.first;  
  68.             if (sz[x] > sz[y]) swap(x, y);  
  69.             par[x] = y;  
  70.             sz[y] += sz[x];  
  71.             dist[x] = p.second + q.second + 1;  
  72.             st.push(x);  
  73.       }  
  74. }  
  75.   
  76. void rollback(int moment)  
  77. {  
  78.       while (st.size() > moment)  
  79.       {  
  80.             int curr = st.top(); st.pop();  
  81.             if (curr == -1)  
  82.             {  
  83.                   bipertite = true;  
  84.             }  
  85.             else  
  86.             {  
  87.                   sz[ par[curr] ] -= sz[curr];  
  88.                   dist[curr] = 0;  
  89.                   par[curr] = curr;  
  90.             }  
  91.       }  
  92. }  
  93.   
  94. bool ans[maxn];  
  95.   
  96. void dfs(int node, int a, int b)  
  97. {  
  98.       if (a > b) return;  
  99.       int moment = st.size();  
  100.       for (pii p : Tree[node]) marge(p.first, p.second);  
  101.       if (a == b)  
  102.       {  
  103.             ans[a] = bipertite;  
  104.       }  
  105.       else  
  106.       {  
  107.             int lchild = node * 2;  
  108.             int rchild = lchild + 1;  
  109.             int mid = (a + b) / 2;  
  110.             dfs(lchild, a, mid);  
  111.             dfs(rchild, mid + 1, b);  
  112.       }  
  113.       rollback(moment);  
  114. }  
  115.   
  116. map <pii, int> in;  
  117. vector <int> queries;  
  118.   
  119. signed main()  
  120. {  
  121.       ios_base::sync_with_stdio(false);  
  122.       cin.tie(nullptr);  
  123.       cout.tie(nullptr);  
  124.   
  125.       #ifndef ONLINE_JUDGE  
  126.             freopen("in.txt""r", stdin);  
  127.       #endif // ONLINE_JUDGE  
  128.   
  129.       int n, q;  
  130.       cin >> n >> q;  
  131.       for (int i = 1; i <= q; i++)  
  132.       {  
  133.             int a, b;  
  134.             cin >> a >> b;  
  135.             assert(a < b);  
  136.             if (!in.count(mk(a, b)))  
  137.             {  
  138.                   in[mk(a, b)] = i;  
  139.             }  
  140.             else  
  141.             {  
  142.                   int l = in[mk(a, b)];  
  143.                   int r = i - 1;  
  144.                   update(1, 1, q, l, r, mk(a, b));  
  145.                   in.erase(mk(a, b));  
  146.             }  
  147.             queries.push_back(i);  
  148.       }  
  149.       for (auto it : in)  
  150.       {  
  151.             int l = it.second;  
  152.             int r = q;  
  153.             int a = it.first.first;  
  154.             int b = it.first.second;  
  155.             update(1, 1, q, l, r, mk(a, b));  
  156.       }  
  157.       makeSet();  
  158.       bipertite = true;  
  159.       dfs(1, 1, q);  
  160.       for (int p : queries) cout << (ans[p] ? "YES" : "NO") << '\n';  
  161. }  

No comments:

Post a Comment

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