Submission #1214047

#TimeUsernameProblemLanguageResultExecution timeMemory
1214047minhpkAdvertisement 2 (JOI23_ho_t2)C++20
100 / 100
422 ms28628 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
     int x,e,id;
};
node z[1000000];
bool cmp(node a,node b){
    return a.x<b.x;
}
bool cmp1(node a,node b){
    return a.e>b.e;
}
int f[4000000];
int f1[4000000];
void build(int id,int l,int r){
    if (l==r){
        f[id]=1e16;
        return;
    }
    int mid =(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    f[id]=min(f[id*2],f[id*2+1]);
}

void build1(int id,int l,int r){
    if (l==r){
        f1[id]=-1e16;
        return;
    }
    int mid =(l+r)/2;
    build1(id*2,l,mid);
    build1(id*2+1,mid+1,r);
    f1[id]=max(f1[id*2],f1[id*2+1]);
}

void update(int id,int l,int r,int pos,int val){
    if (l==r){
        f[id]=val;
        return;
    }
    int mid =(l+r)/2;
    if (pos<=mid){
        update(id*2,l,mid,pos,val);
    }else{
        update(id*2+1,mid+1,r,pos,val);
    }
    f[id]=min(f[id*2],f[id*2+1]);
}

void update1(int id,int l,int r,int pos,int val){
    if (l==r){
        f1[id]=val;
        return;
    }
    int mid =(l+r)/2;
    if (pos<=mid){
        update1(id*2,l,mid,pos,val);
    }else{
        update1(id*2+1,mid+1,r,pos,val);
    }
    f1[id]=max(f1[id*2],f1[id*2+1]);
}

int get(int id,int l,int r,int x,int y){
   if (x>r || y<l){
       return 1e16;
   }
   if (l>=x && y>=r){
       return f[id];
   }
   int mid =(l+r)/2;
   return min(get(id*2,l,mid,x,y),get(id*2+1,mid+1,r,x,y));

}

int get1(int id,int l,int r,int x,int y){
   if (x>r || y<l){
       return -1e16;
   }
   if (l>=x && y>=r){
       return f1[id];
   }
   int mid =(l+r)/2;
   return max(get1(id*2,l,mid,x,y),get1(id*2+1,mid+1,r,x,y));

}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int a;
    cin >> a;
    for (int i=1;i<=a;i++){
        cin >> z[i].x >> z[i].e;
    }
    sort(z+1,z+1+a,cmp);
    for (int i=1;i<=a;i++){
        z[i].id=i;
    }
    sort(z+1,z+1+a,cmp1);
    build(1,1,a);
    build1(1,1,a);
    int ans=0;
    for (int i=1;i<=a;i++){
         bool check=false;
         int pre1=get1(1,1,a,1,z[i].id);
         if (pre1>=z[i].x+z[i].e){
            check=true;
         }
        // cout << z[i].x+z[i].e << " " << pre1 << "\n";
         if (!check){
            int pre2=get(1,1,a,z[i].id,a);
            if (pre2<=z[i].x-z[i].e){
               check=true;
            }
         }
         if (!check){
            ans++;
         }
         update(1,1,a,z[i].id,z[i].x-z[i].e);
         update1(1,1,a,z[i].id,z[i].x+z[i].e);
    }
    cout << ans;

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