Advertisement
mickypinata

TOI13: Chromatography Art

Jul 18th, 2021
1,806
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef tuple<int, int, int, int> tpp;
  6.  
  7. const int N = 1e6;
  8.  
  9. vector<tpp> events;
  10. int fenwick[N + 2];
  11.  
  12. void update(int i, int x){
  13.     for(; i <= N + 1; i += (i & -i)){
  14.         fenwick[i] += x;
  15.     }
  16. }
  17.  
  18. int getSum(int i){
  19.     int sum = 0;
  20.     for(; i >= 1; i -= (i & -i)){
  21.         sum += fenwick[i];
  22.     }
  23.     return sum;
  24. }
  25.  
  26. int main(){
  27.  
  28.     int nPaint, tr;
  29.     scanf("%d%d", &nPaint, &tr);
  30.     for(int i = 1; i <= nPaint; ++i){
  31.         int l, height, length, color;
  32.         scanf("%d%d%d%d", &l, &height, &length, &color);
  33.         events.emplace_back(l, height, color, 1);
  34.         events.emplace_back(l + length, height, color, 2);
  35.     }
  36.     sort(events.begin(), events.end());
  37.  
  38.     int last = 0;
  39.     lli sum = 0;
  40.     for(tpp e : events){
  41.         int pos = get<0>(e);
  42.         int height = get<1>(e);
  43.         int color = get<2>(e);
  44.         int add = get<3>(e);
  45.         if(pos != last){ // Calculate Old Status
  46.             // Lower Bound
  47.             int l = 1;
  48.             int r = 1e6 + 1;
  49.             int lwb = 1e6 + 1;
  50.             while(l <= r){
  51.                 int m = (l + r) / 2;
  52.                 if(getSum(m) <= tr){
  53.                     lwb = min(lwb, m);
  54.                     r = m - 1;
  55.                 } else {
  56.                     l = m + 1;
  57.                 }
  58.             }
  59.             // Upper Bound
  60.             l = 1;
  61.             r = 1e6 + 1;
  62.             int upb = 1e6 + 1;
  63.             while(l <= r){
  64.                 int m = (l + r) / 2;
  65.                 if(getSum(m) < tr){
  66.                     upb = min(upb, m);
  67.                     r = m - 1;
  68.                 } else {
  69.                     l = m + 1;
  70.                 }
  71.             }
  72.             // Calculate Number of tr
  73.             if(getSum(lwb) == tr){
  74.                 sum += (upb - lwb) * (pos - last);
  75.             }
  76.             last = pos;
  77.         }
  78.         if(add == 1){
  79.             update(1, color);
  80.             update(height + 1, -color);
  81.         } else if(add == 2){
  82.             update(1, -color);
  83.             update(height + 1, color);
  84.         }
  85.     }
  86.     cout << sum;
  87.  
  88.     return 0;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement