Submission #1311313

#TimeUsernameProblemLanguageResultExecution timeMemory
1311313aryanLightning Rod (NOI18_lightningrod)C++20
7 / 100
1103 ms195292 KiB
#include<bits/stdc++.h>
using namespace std;

using i64 = long long;


int main(){
        
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    vector<pair<int,int>> a(n);
    vector<int> su(n);
    vector<int> di(n);
    for(int i = 0;i < n;i++){
        cin >> a[i].first >> a[i].second;
        su[i] = a[i].first + a[i].second;
        di[i] = a[i].first - a[i].second; 
    }

    // for(int i = 0;i < n;i++){
    //     cout << su[i] << " ";
    // }
    // cout << '\n';
    // for(int i = 0;i < n;i++){
    //     cout << di[i] << " ";
    // }
    // cout << '\n';

    su.push_back(-1);
    di.push_back(INT_MAX);

    function<int(int,int)> f_ma = [&](int l,int r){
        if(l > r) return n;
        if(l < 0 || r > n) return n;
        int maxi = -1;
        int ind = n;
        for(int i = r;i >= l;i--){
            if(su[i] >= maxi){
                ind = i;
                maxi = su[i];
            }
        }
        return ind;
    };

    function<int(int,int)> f_mi = [&](int l,int r){
        if(l > r) return n;
        if(l < 0 || r > n) return n;
        int maxi = INT_MAX;
        int ind = -1;
        for(int i = l;i <= r;i++){
            if(di[i] <= maxi){
                ind = i;
                maxi = di[i];
            }
        }
        return ind;
    };

    int l = 0;
    int r = n - 1;
    // int ans = 0;
    vector<bool> is(n,false);
    bool d = false;
    while(r >= l){
        int nr = f_ma(l,r);
        int nl = f_mi(l,r);
        // cout << " " << l << " " << r << " " << nl << " " << nr << '\n';
        if(d){
            int bma = f_ma(0,l - 1);
            int fmi = f_mi(r + 1,n - 1); 
            if(su[nr] <= su[bma] && di[nl] >= di[fmi]){
                // ans ++;
                if(is[bma] || is[fmi]) break;
                is[bma] = true;
                break;
            }
            if(su[nr] <= su[bma]){
                is[bma] = true;
            }
            if(di[nl] >= di[fmi]){
                // ans ++;
                is[fmi] = true;
                break;
            }
        }
        d = true;
        if(nr == l || nl == r || nl == nr){
            // ans ++;
            if(nl == l && nr == r){
                if(is[nl] || is[nr]) break;
            }
            if(nl == l){
                is[nl] = true;
            }else if(nr == r){
                is[nr] = true;
            }else{
                is[nl] = true;
            }
            break;
        }
        is[nl] = true;
        is[nr] = true;
        if(nl > nr) is[nl] = true;
        l = nl + 1;
        r = nr - 1;
    }
    int ans = 0;
    for(int i = 0;i < n;i++){
        if(is[i]) ans ++;
    }
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...