Submission #1274100

#TimeUsernameProblemLanguageResultExecution timeMemory
1274100MisterReaperAdvertisement 2 (JOI23_ho_t2)C++20
100 / 100
261 ms22040 KiB
// File advertisement.cpp created on 29.09.2025 at 09:22:03
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int max_N = int(5E5) + 5;
constexpr int inf = int(2E9) + 5;

std::array<int, 3> A[max_N], B[max_N];

int rem[max_N];
int T[max_N << 2][2];

#define def int mid = (l + r) >> 1, lv = v + 1, rv = v + ((mid - l + 1) << 1)

void build(int v, int l, int r) {
    if (l == r) {
        T[v][0] = A[l][0] - A[l][1];
        T[v][1] = A[l][0] + A[l][1];
        return;
    }
    def;
    build(lv, l, mid);
    build(rv, mid + 1, r);
    T[v][0] = std::max(T[lv][0], T[rv][0]);
    T[v][1] = std::min(T[lv][1], T[rv][1]);
}

void rem1(int v, int l, int r, int p, int x) {
    if (p < l || T[v][0] < x) {
        return;
    }
    if (l == r) {
        rem[l] = true;
        T[v][0] = -inf;
        T[v][1] = inf;
        return;
    }
    def;
    rem1(lv, l, mid, p, x);
    rem1(rv, mid + 1, r, p, x);
    T[v][0] = std::max(T[lv][0], T[rv][0]);
    T[v][1] = std::min(T[lv][1], T[rv][1]);
}

void rem2(int v, int l, int r, int p, int x) {
    if (p > r || T[v][1] > x) {
        return;
    }
    if (l == r) {
        rem[l] = true;
        T[v][0] = -inf;
        T[v][1] = inf;
        return;
    }
    def;
    rem2(lv, l, mid, p, x);
    rem2(rv, mid + 1, r, p, x);
    T[v][0] = std::max(T[lv][0], T[rv][0]);
    T[v][1] = std::min(T[lv][1], T[rv][1]);
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    for (int i = 0; i < N; ++i) {
        int X, E;
        std::cin >> X >> E;
        A[i] = {X, E};
    }

    std::sort(A, A + N);
    for (int i = 0; i < N; ++i) {
        A[i][2] = i;
    }

    build(0, 0, N - 1);

    for (int i = 0; i < N; ++i) {
        B[i] = A[i];
    }
    std::sort(B, B + N, [&](auto lhs, auto rhs) {
        return lhs[1] > rhs[1];
    });

    int ans = 0;
    for (int i = 0; i < N; ++i) {
        int j = B[i][2];

        if (rem[j]) {
            continue;
        }
        ans++;
        rem1(0, 0, N - 1, j, A[j][0] - A[j][1]);
        rem2(0, 0, N - 1, j, A[j][0] + A[j][1]);
    }

    std::cout << ans << '\n';

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