This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |