Submission #1146947

#TimeUsernameProblemLanguageResultExecution timeMemory
1146947blackslexSails (IOI07_sails)C++20
5 / 100
986 ms5360 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const int N = 1e5 + 5;
int n, lz[N * 4];

struct node {
    int val, mx;
    node() : val(0), mx(0) {}
    node(int val) : val(val), mx(val) {}
    friend node operator + (const node &l, const node &r) {
        node res = node();
        res.val = l.val + r.val;
        res.mx = max(l.mx, r.mx);
        return res;
    }
} segm[N * 4];

void push (int l, int r, int idx) {
    segm[idx].val += (r - l + 1) * lz[idx];
    segm[idx].mx += lz[idx];
    if (l < r) {
        lz[idx * 2 + 1] += lz[idx];
        lz[idx * 2 + 2] += lz[idx];
    }
    lz[idx] = 0;
}

void upd (int l, int r, int idx, int tl, int tr, int val) {
    push(l, r, idx);
    if (l > tr || r < tl) return;
    if (l >= tl && r <= tr) {
        lz[idx] += val;
        push(l, r, idx);
        return;
    }
    int mid = (l + r) >> 1;
    upd(l, mid, idx * 2 + 1, tl, tr, val);
    upd(mid + 1, r, idx * 2 + 2, tl, tr, val);
    segm[idx] = segm[idx * 2 + 1] + segm[idx * 2 + 2];
}

node qr (int l, int r, int idx, int tl, int tr) {
    push(l, r, idx);
    if (l > tr || r < tl) return node();
    if (l >= tl && r <= tr) return segm[idx];
    int mid = (l + r) >> 1;
    return qr(l, mid, idx * 2 + 1, tl, tr) + qr(mid + 1, r, idx * 2 + 2, tl, tr);
}

int main() {
    scanf("%d", &n);
    vector<pii> c(n);
    for (auto &[x, y]: c) scanf("%d %d", &x, &y);
    reverse(c.begin(), c.end());
    int k = 1e5;
    for (auto &[x, y]: c) {
        int cmn = 1, cmx = x;
        int z0 = qr(1, k, 0, 1, 1).val, zn = qr(1, k, 0, x, x).val;
        if (z0 < zn) {
            {
                int l = cmn, r = cmx;
                while (l < r) {
                    int mid = (l + r + 1) >> 1;
                    if (qr(1, k, 0, cmn, mid).mx == z0) l = mid;
                    else r = mid - 1;
                }
                int z = min(y, l);
                upd(1, k, 0, cmn, cmn + z - 1, 1);
                y -= z;
                cmn += z;
            }
        } else {
            {
                int l = cmn, r = cmx;
                while (l < r) {
                    int mid = (l + r) >> 1;
                    if (qr(1, k, 0, mid, cmx).mx == zn) r = mid;
                    else l = mid + 1;
                }
                int z = min(y, cmx - l + 1);
                upd(1, k, 0, cmx - z + 1, cmx, 1);
                y -= z;
                cmx -= z;
            }
            {
                int l = cmn, r = cmx;
                while (l < r) {
                    int mid = (l + r + 1) >> 1;
                    if (qr(1, k, 0, cmn, mid).mx == z0) l = mid;
                    else r = mid - 1;
                }
                int z = min(y, l);
                upd(1, k, 0, cmn, cmn + z - 1, 1);
                y -= z;
                cmn += z;
            }
        }
        upd(1, k, 0, cmx - y + 1, cmx, 1);
    }
    ll ans = 0;
    for (int i = 1; i <= 10; i++) {
        int z = qr(1, k, 0, i, i).val;
        ans += z * (z - 1) / 2;
    }
    printf("%lld", ans);
}

Compilation message (stderr)

sails.cpp: In function 'int main()':
sails.cpp:55:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
sails.cpp:57:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |     for (auto &[x, y]: c) scanf("%d %d", &x, &y);
      |                           ~~~~~^~~~~~~~~~~~~~~~~
#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...