제출 #951087

#제출 시각아이디문제언어결과실행 시간메모리
951087peterandvoiAdvertisement 2 (JOI23_ho_t2)C++17
100 / 100
572 ms49296 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef ngu
#include "debug.h"
#else
#define debug(...) 42
#endif

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    #ifdef ngu
    freopen("test.inp", "r", stdin);
    freopen("test.out", "w", stdout);
    #endif
    int n;
    cin >> n;
    vector<int> x(n), e(n);
    for (int i = 0; i < n; ++i) {
        cin >> x[i] >> e[i];
    }
    auto vx = x;
    auto ve = e;
    sort(vx.begin(), vx.end());
    vx.erase(unique(vx.begin(), vx.end()), vx.end());
    sort(ve.begin(), ve.end());
    ve.erase(unique(ve.begin(), ve.end()), ve.end());
    for (int i = 0; i < n; ++i) {
        x[i] = lower_bound(vx.begin(), vx.end(), x[i]) - vx.begin();
        e[i] = lower_bound(ve.begin(), ve.end(), e[i]) - ve.begin();
    }
    vector<vector<int>> g((int) ve.size());
    for (int i = 0; i < n; ++i) {
        g[e[i]].emplace_back(i);
    }
    int m = (int) vx.size();
    const int INF = (int) 1e9;
    vector<int> sum(m, -INF), dif(m, INF);
    set<int> s;
    auto cover = [&](int i) {
        if (!s.size()) {
            return false;
        }
        int X = vx[x[i]];
        int E = ve[e[i]];
        auto it = s.lower_bound(x[i]);
        if (it != s.end()) {
            int r = *it;
            if (dif[r] <= X - E) {
                return true;
            }
        }
        if (it != s.begin()) {
            int l = *prev(it);
            if (X + E <= sum[l]) {
                return true;
            }
        }
        return false;
    };
    auto ins = [&](int i) {
        int X = vx[x[i]];
        int E = ve[e[i]];
        dif[x[i]] = min(dif[x[i]], X - E);
        sum[x[i]] = max(sum[x[i]], X + E);
        s.erase(x[i]);
        if (s.size()) {
            auto it = s.lower_bound(x[i]);
            if (it != s.end()) {
                sum[*it] = max(sum[*it], sum[x[i]]);
            }
            if (it != s.begin()) {
                int l = *prev(it);
                dif[l] = min(dif[l], dif[x[i]]);
            }
        }
        s.insert(x[i]);
    };
    int res = 0;
    for (int i = (int) g.size() - 1; ~i; --i) {
        for (int j : g[i]) {
            if (!cover(j)) {
                res++;
                ins(j);
            }
        }
    }
    cout << res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...