Advertisement
YEZAELP

TOI13: art (Segment Tree)

Jul 20th, 2021
1,037
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define F first
  5. #define S second
  6. using lli = long long;
  7. using pi = pair <int, int>;
  8. using piI = pair <int, pi>;
  9. const int N = 1e6 + 10;
  10. const int INF = 1e9;
  11. vector <piI> event;
  12. int tree[2*(1<<21)];
  13. int n, t;
  14.  
  15. void Update(int idx, int l, int r, int pos, int val){
  16.     if(l == r){
  17.         tree[idx] += val;
  18.         return;
  19.     }
  20.     int mid = (l + r) / 2;
  21.     if(pos <= mid) /// left
  22.         Update(2 * idx, l, mid, pos, val);
  23.     else /// right
  24.         Update(2 * idx + 1, mid + 1, r, pos, val);
  25.     tree[idx] = tree[2 * idx] + tree[2 * idx + 1];
  26. }
  27.  
  28. int Sum(int idx, int l, int r, int s, int e){
  29.     if(s <= l and r <= e)
  30.         return tree[idx];
  31.     if(s > r or e < l)
  32.         return 0;
  33.     int mid = (l + r) / 2;
  34.     int Left = Sum(2 * idx, l, mid, s, e);
  35.     int Right = Sum(2 * idx + 1, mid + 1, r, s, e);
  36.     return Left + Right;
  37. }
  38.  
  39. int Min(int l = 1, int r = N - 10, int mn = INF){
  40.     while(l <= r){
  41.         int mid = (l + r) / 2;
  42.         int sum = Sum(1, 1, N - 10, 1, mid);
  43.         if(sum == t)
  44.             r = mid - 1, mn = min(mn, mid);
  45.         else if(sum > t)
  46.             l = mid + 1;
  47.         else
  48.             r = mid - 1;
  49.     }
  50.     return mn;
  51. }
  52.  
  53. int Max(int l = 1, int r = N - 10, int mx = -INF){
  54.     while(l <= r){
  55.         int mid = (l + r) / 2;
  56.         int sum = Sum(1, 1, N - 10, 1, mid);
  57.         if(sum == t)
  58.             l = mid + 1, mx = max(mx, mid);
  59.         else if(sum >= t)
  60.             l = mid + 1;
  61.         else
  62.             r = mid - 1;
  63.     }
  64.     return mx;
  65. }
  66.  
  67. int Cal(){
  68.     int mn = Min();
  69.     if(mn == INF) return 0;
  70.     int mx = Max();
  71.     return mx - mn + 1;
  72. }
  73.  
  74. int main(){
  75.  
  76.     scanf("%d%d", &n, &t);
  77.  
  78.     for(int i=1;i<=n;i++){
  79.         int s, h, w, o;
  80.         scanf("%d%d%d%d", &s, &h, &w, &o);
  81.         event.push_back({ s , {h, o} });
  82.         event.push_back({ s + w , {h, -o} });
  83.     }
  84.  
  85.     sort(event.begin(), event.end());
  86.  
  87.     int prevx = -1, prevh = -1;
  88.     lli ans = 0;
  89.     for(auto e: event){
  90.         int x = e.F;
  91.         int h = e.S.F;
  92.         int c = e.S.S;
  93.  
  94.         if(prevx != -1)
  95.             ans += (lli)( (lli)(x - prevx) * (lli)Cal() );
  96.  
  97.         Update(1, 1, N-10, 1, c);
  98.         Update(1, 1, N-10, h + 1, -c);
  99.  
  100.         prevx = x;
  101.     }
  102.  
  103.     printf("%lld\n", ans);
  104.  
  105.     return 0;
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement