Submission #1355274

#TimeUsernameProblemLanguageResultExecution timeMemory
1355274po_rag526Sails (IOI07_sails)C++20
100 / 100
134 ms7292 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
#define file
#define debug(x) cerr << #x << " = " << x << '\n'

int n, sz;
pair<int, int> p[maxn];

struct node {
    ll sum, lz, mi;
}t[maxn * 4];

void push (int id, int l, int r) {
    if (t[id].lz != 0) {
        int mid = (l + r) >> 1;

        t[id * 2].sum += (mid - l + 1) * t[id].lz;
        t[id * 2 + 1].sum += (r - mid) * t[id].lz;

        t[id * 2].mi += t[id].lz;
        t[id * 2 + 1].mi += t[id].lz;

        t[id * 2].lz += t[id].lz;
        t[id * 2 + 1].lz += t[id].lz;
    }
    t[id].lz = 0;
}
void update (int id, int l, int r, int u, int v) {
    if (u > r || l > v) return ;
    if (u <= l && r <= v) {
        t[id].sum += (r - l + 1);
        t[id].lz += 1;
        t[id].mi += 1;
        return ;
    }

    int mid = (l + r) >> 1;
    push (id, l, r);

    update (id * 2, l, mid, u, v);
    update (id * 2 + 1, mid + 1, r, u, v);

    t[id].sum = t[id * 2].sum + t[id * 2 + 1].sum;
    t[id].mi = min (t[id * 2].mi, t[id * 2 + 1].mi);
}
int getpos (int id, int l, int r, int v, int x) {
    if (l > v || t[id].mi > x) return -1;
    if (l == r) return l;

    int mid = (l + r) >> 1;
    push (id, l, r);
    int res = -1;

    if (t[id * 2].mi <= x) res = getpos (id * 2, l, mid, v, x);
    if (res == -1) res = getpos (id * 2 + 1, mid + 1, r, v, x);

    return res;
}
ll getsum (int id, int l, int r, int u, int v) {
    if (u > r || l > v) return 0;
    if (u <= l && r <= v) return t[id].sum;

    int mid = (l + r) >> 1;
    push (id, l, r);

    return getsum (id * 2, l, mid, u, v) + getsum (id * 2 + 1, mid + 1, r, u, v);
}

void read() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> p[i].first >> p[i].second, sz = max (sz, p[i].first);
}

void solve() {
    sort (p + 1, p + n + 1);

    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        int h = p[i].first, k = p[i].second;
        int r = h, l = r - k + 1;

        ll val_l = getsum (1, 1, sz, l, l), val_r = getsum (1, 1, sz, r, r);
        ll cur = 0, len = r - l + 1;

        if (val_l != val_r) {
            int pos = getpos (1, 1, sz, r, val_l - 1);

            cur += getsum (1, 1, sz, pos, r);
            update (1, 1, sz, pos, r);
            len -= r - pos + 1;
        }

        if (len > 0) {
            int pos = getpos (1, 1, sz, r, val_l);
            cur += getsum (1, 1, sz, pos, pos + len - 1);
            update (1, 1, sz, pos, pos + len - 1);
        }

        ans += cur;
    }
    cout << ans;
}

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

    if (fopen(file".INP","r")) {
        freopen(file".INP","r",stdin);
        freopen(file".OUT","w",stdout);
    }

    read();
    solve();

    return 0;
}

Compilation message (stderr)

sails.cpp: In function 'int main()':
sails.cpp:111:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |         freopen(file".INP","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
sails.cpp:112:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  112 |         freopen(file".OUT","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...