Submission #1208659

#TimeUsernameProblemLanguageResultExecution timeMemory
1208659PakinDioxideSails (IOI07_sails)C++17
100 / 100
58 ms2632 KiB
/*
    author  : PakinDioxide
    created : 26/05/2025 19:47
    task    : IOI07_sails
*/
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int mxN = 1e5+5;

int n;
pair <ll, ll> a[mxN];
ll fen[mxN], idx = LLONG_MAX, ans = 0, t;

void upd(int idx, ll x) { for (int i = idx; i <= mxN; i += i & -i) fen[i] += x; }
void rg(int l, int r, ll x) { upd(r+1, -x), upd(l, x); }
ll qr(int idx) { ll x = 0; for (int i = idx; i > 0; i -= i & -i) x += fen[i]; return x; }
int get(ll x) {
    int l = 1, r = mxN-1, ans = 0;
    while (l <= r) {
        int mid = l + (r-l)/2;
        if (qr(mid) >= x) ans = mid, l = mid+1;
        else r = mid-1;
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i].first >> a[i].second;
    sort(a+1, a+n+1);
    for (int i = 1; i <= n; i++) {
        auto &[h, c] = a[i];
        int l = h-c+1, r = h;
        // cout << l << ' ' << r << '\n';
        int l_ = get(qr(l)+1) + 1, r_ = get(qr(l));
        // cout << l << ' ' << r << ' ' << l_ << ' ' << r_ << '\n';
        if (r_-l+1 >= c) rg(l_, l_+c-1, 1), c = 0;
        else rg(l_, l_+(r_-l+1)-1, 1), c -= (r_-l+1);
        rg(r-c+1, r, 1);
        // cout << h << ' ' << c << '\n';
        // for (int i = 1; i <= 5; i++) cout << qr(i) << ' ';
        // cout << '\n';
    }
    for (int i = 1; i < mxN; i++) t = qr(i), ans += t*(t-1)/2;
    cout << ans << '\n';
}

/*
if there are n sails on each hight, the inefficiency will be n*(n-1)/2
*/
#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...