Submission #1235864

#TimeUsernameProblemLanguageResultExecution timeMemory
1235864AlgorithmWarriorAdvertisement 2 (JOI23_ho_t2)C++20
100 / 100
956 ms36028 KiB
#include <bits/stdc++.h> using namespace std; int n; int const NMAX=500005; struct point{ int x,y; bool operator<(point ot){ return y>ot.y; } }pct[NMAX]; void read(){ cin>>n; int i; for(i=1;i<=n;++i) cin>>pct[i].x>>pct[i].y; sort(pct+1,pct+n+1); } map<int,int>nrm; int norm_total; void normalize(){ int i; for(i=1;i<=n;++i) nrm[pct[i].x]=0; for(auto &[val,new_val] : nrm) new_val=++norm_total; } int const INF=1e9; void maxself(int& x,int val){ if(x<val) x=val; } struct segment_tree{ int v[4*NMAX]; void init(int nod,int st,int dr){ v[nod]=-INF; if(st<dr){ int mij=(st+dr)/2; init(2*nod,st,mij); init(2*nod+1,mij+1,dr); } } void update(int nod,int st,int dr,int pos,int val){ maxself(v[nod],val); if(st<dr){ int mij=(st+dr)/2; if(pos<=mij) update(2*nod,st,mij,pos,val); else update(2*nod+1,mij+1,dr,pos,val); } } int query(int nod,int st,int dr,int a,int b){ if(a<=st && dr<=b) return v[nod]; int mij=(st+dr)/2; int ans=-INF; if(a<=mij) maxself(ans,query(2*nod,st,mij,a,b)); if(b>mij) maxself(ans,query(2*nod+1,mij+1,dr,a,b)); return ans; } }aint1,aint2; int solve(){ int cnt=0; aint1.init(1,1,norm_total); aint2.init(1,1,norm_total); int i; for(i=1;i<=n;++i){ auto [x,y]=pct[i]; bool activ=0; int mxm1=aint1.query(1,1,norm_total,nrm[x],norm_total); if(y-x<=mxm1) activ=1; int mxm2=aint2.query(1,1,norm_total,1,nrm[x]); if(x+y<=mxm2) activ=1; if(!activ){ ++cnt; aint1.update(1,1,norm_total,nrm[x],y-x); aint2.update(1,1,norm_total,nrm[x],x+y); } } return cnt; } int main() { read(); normalize(); cout<<solve(); 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...