제출 #1222542

#제출 시각아이디문제언어결과실행 시간메모리
1222542bbldrizzySails (IOI07_sails)C++20
20 / 100
53 ms1976 KiB
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
using ll = long long;

template <class T> class BIT {
  private:
	int size;
    int LOGN = 0;
	vector<T> bit;
	vector<T> arr;

  public:
	BIT(int size) : size(size), bit(size + 1), arr(size) {
        LOGN = 0;
        while ((1 << (LOGN+1)) <= size) {
            LOGN++;
        }
    }

	void set(int ind, T val) { add(ind, val - arr[ind]); }

	void add(int ind, T val) {
		arr[ind] += val;
		ind++;
		for (; ind <= size; ind += ind & -ind) { bit[ind] += val; }
	}

	T pref_sum(int ind) {
		ind++;
		T total = 0;
		for (; ind > 0; ind -= ind & -ind) { total += bit[ind]; }
		return total;
	}

    int first_below(int v) {
        int sum = 0, pos = 0;
        for (int k = LOGN; k >= 0; --k) {
            int nxt = pos + (1 << k);
            if (nxt <= size && sum + bit[nxt] >= v) {
                sum += bit[nxt];
                pos = nxt;
            }
        }
        return pos;
    }
};

int main() {
    int n; cin >> n;
    vector<pair<int, int>> poles;
    int mx = 0;
    for (int i = 0; i < n; i++) {
        int a, b; cin >> a >> b;
        mx = max(mx, a);
        poles.push_back({a, b});
    }
    sort(poles.begin(), poles.end());
    BIT<int> bit(mx+1);
    for (int i = 0; i < n; i++) {
        int h = poles[i].f;
        int k = poles[i].s;
        int v = bit.pref_sum(h-k);
        int idx1 = min(h, bit.first_below(v));
        int idx2 = min(h, bit.first_below(v+1));
        bit.add(idx1, 1);
        bit.add(h, -1);
        bit.add(idx2, 1);
        bit.add(idx2 + k - (h - idx1), -1);
    }
    ll ans = 0;
    for (int i = 0; i < n; i++) {
        ll x = bit.pref_sum(i);
        ans += (x*(x-1))/2;
    }
    cout << ans;
}
#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...