Submission #1251624

#TimeUsernameProblemLanguageResultExecution timeMemory
1251624apxoSails (IOI07_sails)C++20
100 / 100
68 ms1860 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 1e5 + 5;
int n;
pair<int, int> a[maxn];
long long bit[maxn];
int cnt[maxn];

void update(int i, int x) {
  for (; i < maxn; i += i & (-i)) {
    bit[i] += x;
  }
}

int get(int i) {
  long long ans = 0;
  for (; i > 0; i -= i & (-i)) {
    ans += bit[i];
  }
  return ans;
}

void upd(int l, int r) {
  if (l > r) return;
  update(l, 1);
  update(r + 1, -1);
}

void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i].first >> a[i].second;
  }
  sort(a + 1, a + n + 1);
  int lim = 0;
  for (int i = 1; i <= n; ++i) {
    if (lim + a[i].second <= a[i].first) {
      upd(lim + 1, lim + a[i].second);
      lim += a[i].second;
      continue;
    }
    if (lim < a[i].first) {
      a[i].second -= a[i].first - lim;
      upd(lim + 1, a[i].first);
    }
    int deg = get(lim - a[i].second + 1);
    int l = 1, r = lim, pl = -1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (get(mid) >= deg) {
        pl = mid;
        l = mid + 1;
      } else {
        r = mid - 1;
      }
    }
    l = 1, r = lim;
    int pr = -1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (get(mid) <= deg) {
        pr = mid;
        r = mid - 1;
      } else {
        l = mid + 1;
      }
    }
    upd(pl + 1, lim);
    a[i].second -= lim - pl;
//    debug(i, lim, pl, pr, deg, a[i]);
    upd(pr, pr + a[i].second - 1);
    lim = a[i].first;
  } 
  long long res = 0;
  for (int i = 1; i <= lim; ++i) {
    int x = get(i);
    res += 1ll * x * (x - 1) / 2;
  }
  cout << res;
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...