Submission #1280693

#TimeUsernameProblemLanguageResultExecution timeMemory
1280693ngocphuSails (IOI07_sails)C++20
100 / 100
68 ms1948 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxN = 1e5 + 4;

int n, mx = 0;
pair<int,int> a[maxN];
ll bit[maxN];

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

ll get(int x)
{
    ll res = 0;
    for (; x >= 1; x -= x & -x) res += bit[x];
    return res;
}

int fi(int r, int x)
{
    int l = 1, res = -1;

    while(l <= r)
    {
        int m = (l + r) / 2;

        if (get(m) < x)
        {
            res = m;
            r = m - 1;
        }
        else l = m + 1;
    }

    return res;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

//     freopen("test.INP","r",stdin);
//     freopen("test.OUT","w",stdout);

    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i].first >> a[i].second;
        mx = max(mx, a[i].first);
    }

    sort(a + 1, a + n + 1);

    for (int i = 1; i <= n; ++i)
    {
        int h = a[i].first, k = a[i].second;
        int last = h - k + 1;
        ll val = get(last);

        int p1 = fi(h, val);
        int p2 = fi(h, val + 1);

        if (p1 != -1)
        {
            update(p1, 1);
            update(h + 1, -1);
            k = k - (h - p1 + 1);
        }

        update(p2, 1);
        update(p2 + k, -1);
    }


    ll ans = 0;
    for (int i = 1; i <= mx; ++i)
    {
        ll x = get(i);
        ans += 1ll * x * (x - 1) / 2;
    }

    cout << ans;

    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...