#include <bits/stdc++.h>
using namespace std;
int n;
pair<long long,long long> arr[100005];
int dir[100005];
set<pair<long long,int> >::iterator it;
int solve(){
unordered_map<long long,set<pair<long long,int> > > um[2][4],st[2][4];
for(int i=0; i<n; i++){
st[0][dir[i]][arr[i].first].insert({arr[i].second,i});
st[1][dir[i]][arr[i].second].insert({arr[i].first,i});
um[0][dir[i]][arr[i].first-arr[i].second].insert({arr[i].first,i});
um[1][dir[i]][arr[i].first+arr[i].second].insert({arr[i].first,i});
}
int v[n][3],ded[n];
memset(v,0,sizeof(v));
memset(ded,0,sizeof(ded));
priority_queue<pair<long long,pair<int,int> >,vector<pair<long long,pair<int,int> > >,greater<pair<long long,pair<int,int> > > > pq;
pq.push({0,{0,0}});
while(!pq.empty()){
long long tm=pq.top().first;
int a=pq.top().second.first,b=pq.top().second.second;
//cout << a << ' ' << b << '\n';
pq.pop();
if(!ded[a]){
st[0][dir[a]][arr[a].first].erase({arr[a].second,a});
st[1][dir[a]][arr[a].second].erase({arr[a].first,a});
um[0][dir[a]][arr[a].first-arr[a].second].erase({arr[a].first,a});
um[1][dir[a]][arr[a].first+arr[a].second].erase({arr[a].first,a});
if(dir[a]==0){
it=st[0][2][arr[a].first].lower_bound({arr[a].second+2*tm,-1});
if(it!=st[0][2][arr[a].first].end()){
pq.push({(abs(it->first-arr[a].second)+1)/2ll,{it->second,a}});
}
it=um[0][3][arr[a].first-arr[a].second].lower_bound({arr[a].first+tm,-1});
if(it!=um[0][3][arr[a].first-arr[a].second].end()){
pq.push({it->first-arr[a].first,{it->second,a}});
}
it=um[1][1][arr[a].first+arr[a].second].upper_bound({arr[a].first-tm,1e9});
if(it!=um[1][1][arr[a].first+arr[a].second].begin()){
it--;
pq.push({arr[a].first-it->first,{it->second,a}});
}
}
else if(dir[a]==1){
it=st[1][3][arr[a].second].lower_bound({arr[a].first+2*tm,-1});
if(it!=st[1][3][arr[a].second].end()){
pq.push({(abs(it->first-arr[a].first)+1)/2ll,{it->second,a}});
}
it=um[0][2][arr[a].first-arr[a].second].lower_bound({arr[a].first+tm,-1});
if(it!=um[0][2][arr[a].first-arr[a].second].end()){
pq.push({it->first-arr[a].first,{it->second,a}});
}
it=um[1][0][arr[a].first+arr[a].second].lower_bound({arr[a].first+tm,-1});
if(it!=um[1][0][arr[a].first+arr[a].second].end()){
pq.push({it->first-arr[a].first,{it->second,a}});
}
}
else if(dir[a]==2){
it=st[0][0][arr[a].first].upper_bound({arr[a].second-2*tm,1e9});
if(it!=st[0][0][arr[a].first].begin()){
it--;
pq.push({(abs(arr[a].second-it->first)+1)/2ll,{it->second,a}});
}
it=um[0][1][arr[a].first-arr[a].second].upper_bound({arr[a].first-tm,1e9});
if(it!=um[0][1][arr[a].first-arr[a].second].begin()){
it--;
pq.push({arr[a].first-it->first,{it->second,a}});
}
it=um[1][3][arr[a].first+arr[a].second].lower_bound({arr[a].first+tm,-1});
if(it!=um[1][3][arr[a].first+arr[a].second].end()){
pq.push({it->first-arr[a].first,{it->second,a}});
}
}
else{
it=st[1][1][arr[a].second].upper_bound({arr[a].first-2*tm,1e9});
if(it!=st[1][1][arr[a].second].begin()){
it--;
pq.push({(abs(arr[a].first-it->first)+1)/2ll,{it->second,a}});
}
it=um[0][0][arr[a].first-arr[a].second].upper_bound({arr[a].first-tm,1e9});
if(it!=um[0][0][arr[a].first-arr[a].second].begin()){
it--;
pq.push({arr[a].first-it->first,{it->second,a}});
}
it=um[1][2][arr[a].first+arr[a].second].upper_bound({arr[a].first-tm,1e9});
if(it!=um[1][2][arr[a].first+arr[a].second].begin()){
it--;
pq.push({arr[a].first-it->first,{it->second,a}});
}
}
}
ded[a]=1;
if(arr[a].first==arr[b].first||arr[a].second==arr[b].second){
if(v[a][0]) continue;
v[a][0]=1;
if(dir[b]==0){
it=st[0][2][arr[b].first].lower_bound({arr[b].second+2*tm,-1});
if(it!=st[0][2][arr[b].first].end()){
pq.push({(it->first-arr[b].second+1)/2,{it->second,b}});
}
}
else if(dir[b]==1){
it=st[1][3][arr[b].second].lower_bound({arr[b].first+2*tm,-1});
if(it!=st[1][3][arr[b].second].end()){
pq.push({(it->first-arr[b].first+1)/2,{it->second,b}});
}
}
else if(dir[b]==2){
it=st[0][0][arr[b].first].upper_bound({arr[b].second-2*tm,1e9});
if(it!=st[0][0][arr[b].first].begin()){
it--;
pq.push({(arr[b].second-it->first+1)/2,{it->second,b}});
}
}
else{
it=st[1][1][arr[b].second].upper_bound({arr[b].first-2*tm,1e9});
if(it!=st[1][1][arr[b].second].begin()){
it--;
pq.push({(arr[b].first-it->first+1)/2,{it->second,b}});
}
}
}
else if(arr[a].first-arr[a].second==arr[b].first-arr[b].second){
if(v[a][1]) continue;
v[a][1]=1;
if(dir[b]==0){
it=um[0][3][arr[b].first-arr[b].second].lower_bound({arr[b].first+tm,-1});
if(it!=um[0][3][arr[b].first-arr[b].second].end()){
pq.push({it->first-arr[b].first,{it->second,b}});
}
}
else if(dir[b]==1){
it=um[0][2][arr[b].first-arr[b].second].lower_bound({arr[b].first+tm,-1});
if(it!=um[0][2][arr[b].first-arr[b].second].end()){
pq.push({it->first-arr[b].first,{it->second,b}});
}
}
else if(dir[b]==2){
it=um[0][1][arr[b].first-arr[b].second].upper_bound({arr[b].first-tm,1e9});
if(it!=um[0][1][arr[b].first-arr[b].second].begin()){
it--;
pq.push({arr[b].first-it->first,{it->second,b}});
}
}
else{
it=um[0][0][arr[b].first-arr[b].second].upper_bound({arr[b].first-tm,1e9});
if(it!=um[0][0][arr[b].first-arr[b].second].begin()){
it--;
pq.push({arr[b].first-it->first,{it->second,b}});
}
}
}
else{
assert(arr[a].first+arr[a].second==arr[b].first+arr[b].second);
if(v[a][2]) continue;
v[a][2]=1;
if(dir[b]==0){
it=um[1][1][arr[b].first+arr[b].second].upper_bound({arr[b].first-tm,1e9});
if(it!=um[1][1][arr[b].first+arr[b].second].begin()){
it--;
pq.push({arr[b].first-it->first,{it->second,b}});
}
}
else if(dir[b]==1){
it=um[1][0][arr[b].first+arr[b].second].lower_bound({arr[b].first+tm,-1});
if(it!=um[1][0][arr[b].first+arr[b].second].end()){
pq.push({it->first-arr[b].first,{it->second,b}});
}
}
else if(dir[b]==2){
it=um[1][3][arr[b].first+arr[b].second].lower_bound({arr[b].first+tm,-1});
if(it!=um[1][3][arr[b].first+arr[b].second].end()){
pq.push({it->first-arr[b].first,{it->second,b}});
}
}
else{
it=um[1][2][arr[b].first+arr[b].second].upper_bound({arr[b].first-tm,1e9});
if(it!=um[1][2][arr[b].first+arr[b].second].begin()){
it--;
pq.push({arr[b].first-it->first,{it->second,b}});
}
}
}
}
int ret=0;
for(int i=0; i<n; i++) if(ded[i]) ret++;
return ret;
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i=0; i<n; i++){
cin >> arr[i].first >> arr[i].second;
}
long long sm=arr[0].first+arr[0].second,df=arr[0].first-arr[0].second;
dir[0]=0;
for(int i=1; i<n; i++){
if(arr[i].first-arr[i].second<df&&arr[i].first+arr[i].second>sm){
dir[i]=2;
}
else if(arr[i].first-arr[i].second>=df&&arr[i].first+arr[i].second>sm){
dir[i]=3;
}
else if(arr[i].first-arr[i].second>=df&&arr[i].first+arr[i].second<=sm){
dir[i]=0;
}
else dir[i]=1;
}
int ans=0;
ans=max(ans,solve());
dir[0]=1;
for(int i=1; i<n; i++){
if(arr[i].first-arr[i].second<=df&&arr[i].first+arr[i].second>sm){
dir[i]=2;
}
else if(arr[i].first-arr[i].second>df&&arr[i].first+arr[i].second>sm){
dir[i]=3;
}
else if(arr[i].first-arr[i].second>df&&arr[i].first+arr[i].second<=sm){
dir[i]=0;
}
else dir[i]=1;
}
ans=max(ans,solve());
dir[0]=2;
for(int i=1; i<n; i++){
if(arr[i].first-arr[i].second<=df&&arr[i].first+arr[i].second>=sm){
dir[i]=2;
}
else if(arr[i].first-arr[i].second>df&&arr[i].first+arr[i].second>=sm){
dir[i]=3;
}
else if(arr[i].first-arr[i].second>df&&arr[i].first+arr[i].second<sm){
dir[i]=0;
}
else dir[i]=1;
}
ans=max(ans,solve());
dir[0]=3;
for(int i=1; i<n; i++){
if(arr[i].first-arr[i].second<df&&arr[i].first+arr[i].second>=sm){
dir[i]=2;
}
else if(arr[i].first-arr[i].second>=df&&arr[i].first+arr[i].second>=sm){
dir[i]=3;
}
else if(arr[i].first-arr[i].second>=df&&arr[i].first+arr[i].second<sm){
dir[i]=0;
}
else dir[i]=1;
}
ans=max(ans,solve());
cout << 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... |