Submission #1262536

#TimeUsernameProblemLanguageResultExecution timeMemory
1262536phtungLightning Rod (NOI18_lightningrod)C++20
0 / 100
1107 ms330692 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

struct Interval {
    int L, R, id;
};

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

    int n; cin >> n;
    vector<pair<int,int>> b(n);
    for (int i=0;i<n;i++) cin >> b[i].first >> b[i].second;

    vector<Interval> seg;
    for (int i=0;i<n;i++) {
        int x = b[i].first, y = b[i].second;
        seg.push_back({x-y, x+y, i});
    }

    sort(seg.begin(), seg.end(), [&](auto a, auto b){
        if (a.L != b.L) return a.L < b.L;
        return a.R > b.R;
    });

    // lọc khoảng bị bao trùm
    vector<Interval> clean;
    int bestR = -1e18;
    for (auto it: seg) {
        if (it.R > bestR) {
            clean.push_back(it);
            bestR = it.R;
        }
    }

    // greedy phủ các tòa
    int res = 0;
    int coverR = -1e18;
    int idx = 0;
    for (int i=0;i<n;i++) {
        int x = b[i].first, y = b[i].second;
        // điểm phải nằm trong ít nhất một khoảng
        if (x > coverR) {
            // chọn khoảng trong clean có L <= x và R lớn nhất
            while (idx+1 < (int)clean.size() && clean[idx+1].L <= x) idx++;
            coverR = clean[idx].R;
            res++;
        }
    }
    cout << res << "\n";
}
#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...