제출 #198622

#제출 시각아이디문제언어결과실행 시간메모리
198622MetBSails (IOI07_sails)C++14
5 / 100
167 ms2680 KiB
#include <bits/stdc++.h>
 
#define N 1000001
 
using namespace std;
 
typedef long long ll;
 
const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;

ll n, m;

struct BIT {
	ll t[N];

	void update (int l, int r) {
		r++;
		for (; r <= m; r = (r | (r + 1)))
			t[r]--;
		for (; l <= m; l = (l | (l + 1)))
			t[l]++;
	}

	ll get (ll x) {
		ll sum = 0;
		for (; x >= 0; x = (x & (x + 1)) - 1)
			sum += t[x];
		return sum;
	}

	ll upper_bound (ll n, ll x) {
		int l = 0, r = n - 1;
		if (get (r) < x) return r + 1;

		while (l < r) {
			int mid = (l + r) / 2;
			if (get (mid) < x) l = mid + 1;
			else r = mid;
		}

		return l;
	}
} t;
pair <ll, ll> a[N];

int main () {
	cin >> n;

	for (ll i = 0; i < n; i++) {
		cin >> a[i].first >> a[i].second;
		m = max (m, a[i].first);
	}

	sort (a, a + n);

	for (ll i = n - 1; i >= 0; i--) {
		if (!a[i].second) continue;
		ll x = t.get (a[i].second - 1);
		ll l = t.upper_bound (a[i].first, x);
		ll r = t.upper_bound (a[i].first, x + 1) - 1;
		t.update (0, l - 1);
		a[i].second -= l;
		t.update (r - a[i].second + 1, r);
	}

	ll sum = 0;

	for (ll i = 0; i <= m; i++) {
		ll x = t.get (i);
		sum += x * (x - 1) / 2;
	}

	cout << sum;
}
#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...