Submission #1235988

#TimeUsernameProblemLanguageResultExecution timeMemory
1235988wetspongeAdvertisement 2 (JOI23_ho_t2)C++20
100 / 100
1920 ms136484 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define mod 1000000007
const int N=(1ll<<20);
array <int,2> Tree[2][N*2+5];
int n,E[500001],X[500001],inf=1e17;
map <int,int> key;
set <int> st;
void update(int i,int u,int val,int idx){
    i+=N;
    Tree[u][i]={val,idx};
    i/=2;
    while(i!=0){
        Tree[u][i]=max(Tree[u][i*2],Tree[u][i*2+1]);
        i/=2;
    }
    return;
}
array <int,2> solve(int l1,int r1,int i,int l,int r,int u){
    if(l1>r||l>r1) return {-inf,-1};
    if(l<=l1&&r1<=r) return Tree[u][i];
    return max(solve(l1,(l1+r1)/2,i*2,l,r,u),solve((l1+r1)/2+1,r1,i*2+1,l,r,u));
}
bool cover(int i,int j){
    if(i==-1) return 0;
    return ((E[i]-E[j])>=abs(X[i]-X[j]));
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n;
    vector <array<int,2>> v;
    for(int i=0;i<=N*2+4;i++) Tree[0][i]=Tree[1][i]={-inf,-1};
    for(int i=1;i<=n;i++){
        cin>>X[i]>>E[i];
        st.insert(X[i]);
        v.push_back({E[i],i});
    }
    int comp=1;
    for(int i:st) key[i]=comp++;
    sort(v.begin(),v.end());
    reverse(v.begin(),v.end());
    int ans=0;
    for(auto [val,i]:v){
        int idx1=solve(0,N-1,1,key[X[i]],n,0)[1],idx2=solve(0,N-1,1,1,key[X[i]],1)[1];
        if(cover(idx1,i)==1||cover(idx2,i)==1) continue;
        ans++;
        update(key[X[i]],0,E[i]-X[i],i);
        update(key[X[i]],1,E[i]+X[i],i);
    }
    cout<<ans<<endl;
}
//179276892
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...