Submission #1236528

#TimeUsernameProblemLanguageResultExecution timeMemory
1236528theSkeletonIOI Fever (JOI21_fever)C++20
19 / 100
1112 ms589824 KiB
//!!in the name of god!!
#include<bits/stdc++.h>
#define space <<' '<<
#define endl '\n'
#define inf 1e18
#define F first
#define S second
#define PB push_back
#define PF push_front
#define pll pair<ll,ll>
#define pii pair<int,int>
#define md(a) ((a+mod)%mod)
#define MP(a,b) make_pair(a,b)
#define all(a) a.begin(),a.end()
#define MT(a,b,c) make_tuple(a,b,c)
#define has(a,b) (a.find(b)!=a.end())
typedef long long ll;
using namespace std;
template<typename t> using heap=
priority_queue<t,vector<t>,greater<t>>;
const int mx = 3e3+5;

typedef long double ld;

pll arr[mx];
int dir[mx];
pii sav[5]{
    MP(0,0),
    MP(-1,0),
    MP(0,-1),
    MP(1,0),
    MP(0,1),
};
ld dp[mx];

inline int fix(int i,ll x,ll y){
    int o=0;
    if(abs(x-arr[i].F)>abs(y-arr[i].S)){
        o=(x>arr[i].F)?3:1;
    }
    if(abs(x-arr[i].F)<abs(y-arr[i].S)){
        o=(y>arr[i].S)?4:2;
    }
    return o;
}

int main(){
    std::ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    vector<int> sp;
    for(ll x,y,i=1;i<=n;i++){
        cin>>x>>y;
        arr[i]=MP(x,y);
        if(1<i){
            dir[i]=fix(i,arr[1].F,arr[1].S);
            if(dir[i]==0){
                sp.PB(i);
            }
        }
    }
    int o=1;
    heap<pair<ld,int>> lst;
    for(int d=1;d<=4;d++){
        dir[1]=d;
        ll x=arr[1].F+sav[d].F;
        ll y=arr[1].S+sav[d].S;
        for(int i:sp){
            dir[i]=fix(i,x,y);
        }
        fill(dp,dp+mx,inf);
        lst.push(MP(0,1));
        while(!lst.empty()){
            int i=lst.top().S;
            ld di=lst.top().F;
            dp[i]=min(dp[i],di);
            lst.pop();
            for(int j=1;j<=n;j++){
                if(i!=j){
                    if(dir[i]%2==dir[j]%2){
                        ld v0,v1,d0,d1;
                        if(dir[i]%2){
                            v0=arr[i].F;
                            v1=arr[j].F;
                            d0=arr[i].S;
                            d1=arr[j].S;
                        }
                        else{
                            v0=arr[i].S;
                            v1=arr[j].S;
                            d0=arr[i].F;
                            d1=arr[j].F;
                        }
                        if(d0==d1){
                            if((v0<v1&&dir[i]>dir[j])||(v0>v1&&dir[i]<dir[j])){
                                ld t=((v0+v1)/(ld)2)-min(v0,v1);
                                if(di<t){
                                    lst.push(MP(t,j));
                                }
                            }
                        }
                    }
                    else{
                        int t=fix(i,arr[j].F,arr[j].S);
                        if(t==0){
                            bool xk=arr[j].F<arr[i].F?(dir[i]==1||dir[j]==3):(dir[i]==3||dir[j]==1);
                            bool yk=arr[j].S<arr[i].S?(dir[i]==2||dir[j]==4):(dir[i]==4||dir[j]==2);
                            if(xk&&yk){
                                if(di<abs(arr[i].F-arr[j].F)){
                                    lst.push(MP(abs(arr[i].F-arr[j].F),j));
                                }
                            }
                        }
                    }
                }
            }
        }
        int c=0;
        for(int i=1;i<=n;i++){
            c+=dp[i]<inf;
        }
        o=max(o,c);
    }
    cout<<o;
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...