SansPapyrus683

Unoptimized Solution to "Restructuring Company"

Feb 19th, 2022 (edited)
653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. using std::cout;
  6. using std::endl;
  7. using std::vector;
  8. using std::pair;
  9.  
  10. class DisjointSets {
  11.     private:
  12.         vector<int> parents;
  13.         vector<int> sizes;
  14.     public:
  15.         DisjointSets(int size) : parents(size), sizes(size, 1) {
  16.             for (int i = 0; i < size; i++) {
  17.                 parents[i] = i;
  18.             }
  19.         }
  20.  
  21.         int get_rep(int n) {
  22.             return parents[n] == n ? n : (parents[n] = get_rep(parents[n]));
  23.         }
  24.  
  25.         bool link(int n1, int n2) {
  26.             n1 = get_rep(n1);
  27.             n2 = get_rep(n2);
  28.             if (n1 == n2) {
  29.                 return false;
  30.             }
  31.             if (sizes[n1] < sizes[n2]) {
  32.                 std::swap(n1, n2);
  33.             }
  34.             sizes[n1] += sizes[n2];
  35.             parents[n2] = n1;
  36.             return true;
  37.         }
  38. };
  39.  
  40. /**
  41.  * https://codeforces.com/edu/course/2/lesson/7/2/practice/contest/289391/problem/C
  42.  * (sample input omitted due to length)
  43.  */
  44. int main() {
  45.     int employee_num;
  46.     int query_num;
  47.     std::cin >> employee_num >> query_num;
  48.     DisjointSets company(employee_num);
  49.     std::set<pair<int, int>> ranges;  // inclusive
  50.     for (int q = 0; q < query_num; q++) {
  51.         int type;
  52.         int arg1, arg2;
  53.         std::cin >> type >> arg1 >> arg2;
  54.         arg1--;
  55.         arg2--;
  56.         if (type == 1) {
  57.             company.link(arg1, arg2);
  58.         } else if (type == 2) {
  59.             int start = ranges.begin()->first;
  60.             if (ranges.empty()
  61.                     || arg2 < start
  62.                     || ranges.rbegin()->second < arg1) {
  63.                 for (int i = arg1 + 1; i <= arg2; i++) {
  64.                     company.link(i, i - 1);
  65.                 }
  66.                 ranges.insert({arg1, arg2});
  67.                 continue;
  68.             }
  69.  
  70.             vector<pair<int, int>> unneeded;
  71.             pair<int, int> new_int{arg1, arg2};
  72.             pair<int, int> to_merge{arg1, arg2};
  73.             pair<int, int> range1{-1, -1};
  74.             if (arg1 > start) {
  75.                 range1 = *--ranges.upper_bound({arg1, 0});
  76.                 if (range1.first <= arg1 && arg1 <= range1.second) {
  77.                     new_int.first = range1.first;
  78.                     to_merge.first = range1.second;
  79.                     unneeded.push_back(range1);
  80.                 }
  81.             }
  82.  
  83.             pair<int, int> range2 = *--ranges.upper_bound({arg2, 0});
  84.             if (range1 == range2 && range1.first <= arg1 && arg2 <= range1.second) {
  85.                 continue;
  86.             }
  87.             if (range2.first <= arg2 && arg2 <+ range2.second) {
  88.                 new_int.second = range2.second;
  89.                 to_merge.second = range2.first;
  90.                 unneeded.push_back(range2);
  91.             }
  92.  
  93.             auto it = ranges.lower_bound({to_merge.first, 0});
  94.             for (int i = to_merge.first + 1; i <= to_merge.second; i++) {
  95.                 company.link(i, i - 1);
  96.                 if (i == it->first) {
  97.                     i = it->second;
  98.                     unneeded.push_back(*it);
  99.                     it++;
  100.                 }
  101.             }
  102.  
  103.             for (const pair<int, int>& r : unneeded) {
  104.                 ranges.erase(r);
  105.             }
  106.             ranges.insert(new_int);
  107.             // cout << ranges << endl;
  108.         } else if (type == 3) {
  109.             bool same = company.get_rep(arg1) == company.get_rep(arg2);
  110.             cout << (same ? "YES" : "NO") << '\n';
  111.         }
  112.     }
  113. }
  114.  
Add Comment
Please, Sign In to add comment