Submission #949076

#TimeUsernameProblemLanguageResultExecution timeMemory
949076MilosMilutinovicIOI Fever (JOI21_fever)C++14
25 / 100
914 ms524288 KiB
#include<bits/stdc++.h> #define pb push_back #define fi first #define se second #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef long double ld; template <typename T> bool chkmin(T &x,T y){return x>y?x=y,1:0;} template <typename T> bool chkmax(T &x,T y){return x<y?x=y,1:0;} ll readint(){ ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int dx[]={1,0,-1,0}; const int dy[]={0,1,0,-1}; int n; int d1[100005],d2[100005]; ll x[100005],y[100005],dir[100005]; bool vis[100005]; int main(){ n=readint(); for(int i=1;i<=n;i++) x[i]=readint(),y[i]=readint(),x[i]*=2,y[i]*=2; vector<int> xs1,xs2; for(int i=1;i<=n;i++){ xs1.pb(x[i]+y[i]); xs2.pb(x[i]-y[i]); } sort(xs1.begin(),xs1.end()); xs1.erase(unique(xs1.begin(),xs1.end()),xs1.end()); sort(xs2.begin(),xs2.end()); xs2.erase(unique(xs2.begin(),xs2.end()),xs2.end()); int sz1=(int)xs1.size(),sz2=(int)xs2.size(); vector<set<pii>> st1(sz1),st2(sz2); vector<vector<int>> ids1(sz1),ids2(sz2); for(int i=1;i<=n;i++){ d1[i]=(int)(lower_bound(xs1.begin(),xs1.end(),x[i]+y[i])-xs1.begin()); d2[i]=(int)(lower_bound(xs2.begin(),xs2.end(),x[i]-y[i])-xs2.begin()); st1[d1[i]].emplace(x[i],i); st2[d2[i]].emplace(x[i],i); ids1[d1[i]].pb(i); ids2[d2[i]].pb(i); } for(int i=0;i<sz1;i++){ sort(ids1[i].begin(),ids1[i].end(),[&](int i,int j){return x[i]<x[j];}); } for(int i=0;i<sz2;i++){ sort(ids2[i].begin(),ids2[i].end(),[&](int i,int j){return x[i]<x[j];}); } int ans=0; for(int d=0;d<4;d++){ for(int i=1;i<=n;i++) vis[i]=false; dir[1]=d; priority_queue<pair<ll,pii>> pq; pq.push(mp(0,mp(1,d))); for(int i=1;i<=n;i++){ st1[d1[i]].emplace(x[i],i); st2[d2[i]].emplace(x[i],i); } while(!pq.empty()){ ll t=-pq.top().fi; int i=pq.top().se.fi; int dd=pq.top().se.se; pq.pop(); if(vis[i]) continue; dir[i]=dd; vis[i]=true; auto it1=st1[d1[i]].lower_bound(mp(x[i],i)); st1[d1[i]].erase(it1); auto it2=st2[d2[i]].lower_bound(mp(x[i],i)); st2[d2[i]].erase(it2); if(dir[i]==0){ // up { int low=0,high=ids1[d1[i]].size()-1,p=-1; while(low<=high){ int mid=(low+high)/2; if(x[i]-x[ids1[d1[i]][mid]]>=t) p=mid,low=mid+1; else high=mid-1; } for(int j=0;j<=p;j++) pq.push(mp(-(x[i]-x[ids1[d1[i]][j]]),mp(ids1[d1[i]][j],2))); } { int low=0,high=ids2[d2[i]].size()-1,p=high+1; while(low<=high){ int mid=(low+high)/2; if(x[ids2[d2[i]][mid]]-x[i]>=t) p=mid,high=mid-1; else low=mid+1; } for(int j=p;j<(int)ids2[d2[i]].size();j++) pq.push(mp(-(x[ids2[d2[i]][j]]-x[i]),mp(ids2[d2[i]][j],3))); } } if(dir[i]==1){ // down { int low=0,high=ids1[d1[i]].size()-1,p=high+1; while(low<=high){ int mid=(low+high)/2; if(x[ids1[d1[i]][mid]]-x[i]>=t) p=mid,high=mid-1; else low=mid+1; } for(int j=p;j<(int)ids1[d1[i]].size();j++) pq.push(mp(-(x[ids1[d1[i]][j]]-x[i]),mp(ids1[d1[i]][j],3))); } { int low=0,high=ids2[d2[i]].size()-1,p=-1; while(low<=high){ int mid=(low+high)/2; if(x[i]-x[ids2[d2[i]][mid]]>=t) p=mid,low=mid+1; else high=mid-1; } for(int j=0;j<=p;j++) pq.push(mp(-(x[i]-x[ids2[d2[i]][j]]),mp(ids2[d2[i]][j],2))); } } if(dir[i]==2){ // right { int low=0,high=ids1[d1[i]].size()-1,p=high+1; while(low<=high){ int mid=(low+high)/2; if(x[ids1[d1[i]][mid]]-x[i]>=t) p=mid,high=mid-1; else low=mid+1; } for(int j=p;j<(int)ids1[d1[i]].size();j++) pq.push(mp(-(x[ids1[d1[i]][j]]-x[i]),mp(ids1[d1[i]][j],0))); } { int low=0,high=ids2[d2[i]].size()-1,p=high+1; while(low<=high){ int mid=(low+high)/2; if(x[ids2[d2[i]][mid]]-x[i]>=t) p=mid,high=mid-1; else low=mid+1; } for(int j=p;j<(int)ids2[d2[i]].size();j++) pq.push(mp(-(x[ids2[d2[i]][j]]-x[i]),mp(ids2[d2[i]][j],1))); } } if(dir[i]==3){ // left { int low=0,high=ids1[d1[i]].size()-1,p=-1; while(low<=high){ int mid=(low+high)/2; if(x[i]-x[ids1[d1[i]][mid]]>=t) p=mid,low=mid+1; else high=mid-1; } for(int j=0;j<=p;j++) pq.push(mp(-(x[i]-x[ids1[d1[i]][j]]),mp(ids1[d1[i]][j],1))); } { int low=0,high=ids2[d2[i]].size()-1,p=-1; while(low<=high){ int mid=(low+high)/2; if(x[i]-x[ids2[d2[i]][mid]]>=t) p=mid,low=mid+1; else high=mid-1; } for(int j=0;j<=p;j++) pq.push(mp(-(x[i]-x[ids2[d2[i]][j]]),mp(ids2[d2[i]][j],0))); } } } int cnt=0; for(int i=1;i<=n;i++) cnt+=vis[i]; ans=max(ans,cnt); } printf("%d\n",ans); }
#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...