Advertisement
adityasuman100

Segment tree count of time units invigilator required

Nov 11th, 2023 (edited)
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. #include "/home/ad/ad_debugger.h"
  6. Debugger D;
  7. #define d(x)            \
  8.     cerr << #x << "  "; \
  9.     D.print(x);         \
  10.     cerr << '\n';
  11.  
  12. #define da(x, n)       \
  13.     cerr << #x << " "; \
  14.     D.print(x, n);     \
  15.     cerr << "\n";
  16.  
  17. class obj
  18. {
  19. public:
  20.     unordered_map<int, int> mp;
  21.  
  22.     obj()
  23.     {
  24.     }
  25. };
  26.  
  27. class segmentTree
  28. {
  29. public:
  30.     vector<obj> segment;
  31.     segmentTree(int n)
  32.     {
  33.         // Creating a segment tree of size 4*N + 1.
  34.         segment = vector<obj>(4 * n + 1);
  35.     }
  36.  
  37.     void buildTree(vector<int> &arr, int l, int r, int index = 0)
  38.     {
  39.         if (l > r)
  40.         {
  41.             return;
  42.         }
  43.  
  44.         // It means it has only one element
  45.         if (l == r)
  46.         {
  47.             // segment[index].max_sum = arr[l];
  48.             // segment[index].max_prefix_sum = arr[l];
  49.             // segment[index].max_suffix_sum = arr[l];
  50.             // segment[index].sum = arr[l];
  51.             segment[index].mp[arr[l]]++;
  52.             return;
  53.         }
  54.  
  55.         int mid = (l + r) / 2;
  56.         int lChild = 2 * index + 1;
  57.         int rChild = 2 * index + 2;
  58.  
  59.         buildTree(arr, l, mid, lChild);
  60.         buildTree(arr, mid + 1, r, rChild);
  61.  
  62.         // Merging ans from leftChild and rightChild.
  63.         // segment[index].sum = segment[lChild].sum + segment[rChild].sum;
  64.         // segment[index].max_prefix_sum = max(segment[lChild].max_prefix_sum, segment[lChild].sum + segment[rChild].max_prefix_sum);
  65.         // segment[index].max_suffix_sum = max(segment[rChild].max_suffix_sum, segment[rChild].sum + segment[lChild].max_suffix_sum);
  66.         // segment[index].max_sum = max(segment[lChild].max_sum, max(segment[rChild].max_sum, segment[lChild].max_suffix_sum + segment[rChild].max_prefix_sum));
  67.         for (auto [key, val] : segment[lChild].mp)
  68.         {
  69.             segment[index].mp[key] += val;
  70.         }
  71.         for (auto [key, val] : segment[rChild].mp)
  72.         {
  73.             segment[index].mp[key] += val;
  74.         }
  75.     }
  76.  
  77.     obj query(int l, int r, int ql, int qr, int index)
  78.     {
  79.         // If the l and r lies inside queries range then that complete node is part of ans.
  80.         if (ql <= l && qr >= r)
  81.         {
  82.             return segment[index];
  83.         }
  84.  
  85.         int mid = (l + r) / 2;
  86.  
  87.         // If the leftChild has no overlapping with queries range then ans only lies in right part.
  88.         if (mid < ql)
  89.         {
  90.             return query(mid + 1, r, ql, qr, 2 * index + 2);
  91.         }
  92.  
  93.         // If the rightChild has no overlapping with queries range then ans only lies in left part.
  94.         if (mid + 1 > qr)
  95.         {
  96.             return query(l, mid, ql, qr, 2 * index + 1);
  97.         }
  98.  
  99.         obj ans1 = query(l, mid, ql, qr, 2 * index + 1);
  100.         obj ans2 = query(mid + 1, r, ql, qr, 2 * index + 2);
  101.  
  102.         obj ans;
  103.  
  104.         // Merging answer from left and right child.
  105.         // ans.sum = ans1.sum + ans2.sum;
  106.         // ans.max_sum = max(ans1.max_sum, max(ans2.max_sum, ans1.max_suffix_sum + ans2.max_prefix_sum));
  107.         // ans.max_prefix_sum = max(ans1.max_prefix_sum, ans1.sum + ans2.max_prefix_sum);
  108.         // ans.max_suffix_sum = max(ans2.max_suffix_sum, ans2.sum + ans1.max_suffix_sum);
  109.  
  110.         for (auto [key, val] : ans1.mp)
  111.         {
  112.             ans.mp[key] += val;
  113.         }
  114.         for (auto [key, val] : ans2.mp)
  115.         {
  116.             ans.mp[key] += val;
  117.         }
  118.  
  119.         return ans;
  120.     }
  121.  
  122.     obj query(int l, int r, int ql, int qr)
  123.     {
  124.         obj ans = query(l, r, ql, qr, 0);
  125.         return ans;
  126.     }
  127. };
  128.  
  129. vector<int> minTime(vector<int> start, vector<int> end, vector<int> q_start, vector<int> q_end, int k)
  130. {
  131.     int n = start.size();
  132.  
  133.     int maxi = *max_element(end.begin(), end.end());
  134.     vector<int> prefix(maxi + 2, 0); // in case we need index maxi+1
  135.  
  136.     for (int i = 0; i < n; i++)
  137.     {
  138.         int s = start[i];
  139.         int e = end[i];
  140.         prefix[s] += 1;
  141.         prefix[e + 1] -= 1;
  142.     }
  143.  
  144.     for (int i = 1; i < prefix.size(); i++)
  145.     {
  146.         prefix[i] += prefix[i - 1];
  147.     }
  148.  
  149.     segmentTree ST(n);
  150.  
  151.     ST.buildTree(prefix, 0, prefix.size() - 1);
  152.  
  153.     vector<int> ans(q_start.size());
  154.  
  155.     for (int i = 0; i < q_start.size(); i++)
  156.     {
  157.         int s = q_start[i];
  158.         int e = q_end[i];
  159.  
  160.         obj temp = ST.query(0, prefix.size() - 1, s, e);
  161.         int cnt = 0;
  162.         for (auto [key, val] : temp.mp)
  163.         {
  164.             if (key >= k)
  165.             {
  166.                 cnt += val;
  167.             }
  168.         }
  169.         ans[i] = cnt;
  170.     }
  171.     return ans;
  172. }
  173.  
  174. int main()
  175. {
  176.     // vector<int> start = {1, 3, 2, 5};
  177.     vector<int> start = {1,2,4};
  178.     // vector<int> end = {3, 5, 3, 6};
  179.     // vector<int> end = {3,4,5};
  180.     vector<int> end = {4,5,5};
  181.     // vector<int> q_start = {1, 3};
  182.     vector<int> q_start = {2,5};
  183.     // vector<int> q_end = {4, 6};
  184.     vector<int> q_end = {6,6};
  185.     int k = 3;
  186.  
  187.     vector<int> ans = minTime(start, end, q_start, q_end, k);
  188.     // d(ans);
  189.  
  190. }
Tags: segment_tree
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement