Submission #1345926

#TimeUsernameProblemLanguageResultExecution timeMemory
1345926MrAndriaNaval battle (CEOI24_battle)C++20
6 / 100
3 ms536 KiB
#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
//#define int long long
int n,x[5005],y[5005];
char ch[5005];
int a[5005],b[5005],parent[5005],sz[5005],ans,vis[5005];
vector <pair <int,pair <int,int> > > vec;
void make_set(int x){
    parent[x]=x;
    sz[x]=1;
}
int find_set(int x){
    if(parent[x]==x){
        return x;
    }
    return parent[x]=find_set(parent[x]);
}
void union_sets(int x,int y){
    x=find_set(x);
    y=find_set(y);
    if(x!=y){
        if(sz[x]<sz[y]){
            swap(x,y);
        }
        parent[y]=x;
        sz[x]+=sz[y];
    }
}
int main(){
    cin>>n;
    
    for(int i=1;i<=n;i++){
        make_set(i);
        cin>>x[i]>>y[i]>>ch[i];
        if(ch[i]=='N'){
            a[i]=0;
            b[i]=-1;
            continue;
        }
        if(ch[i]=='S'){
            a[i]=0;
            b[i]=1;
            continue;
        }
        if(ch[i]=='E'){
            a[i]=1;
            b[i]=0;
            continue;
        }
        if(ch[i]=='W'){
            a[i]=-1;
            b[i]=0;
            continue;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if((a[j]==a[i] and x[j]!=x[i]) or (b[j]==b[i] and y[j]!=y[i]))continue;
            int dx,dy;
            if(a[i]==a[j]){
                dx=-INT_MAX;
            }else{
                dx=(x[i]-x[j])/(a[j]-a[i]);
            }
            if(b[i]==b[j]){
                dy=-INT_MAX;
            }else{
                dy=(y[i]-y[j])/(b[j]-b[i]);
            }
            if(dx==-INT_MAX or dy==-INT_MAX){
            // cout<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
                vec.pb(make_pair(max(dx,dy),make_pair(i,j)));
                continue;
            }
            if(dx!=dy){
                continue;
            }
            // cout<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
            vec.pb(make_pair(max(dx,dy),make_pair(i,j)));
            
        }
    }
    sort(vec.begin(),vec.end());
    
    for(auto x:vec){
        int u=x.ss.ff;
        int v=x.ss.ss;
        int c=x.ff;
        if(c<=0){
            assert(0);
        }
        if((vis[u]<c and vis[u]!=0) or (vis[v]<c and vis[v]!=0))continue;
        // cout<<u<<" "<<v<<" "<<c<<endl;
        vis[u]=c;
        vis[v]=c;
        union_sets(u,v);
    }
    for(int i=1;i<=n;i++){
        if(sz[find_set(i)]==1){
            cout<<i<<"\n";
        }
    }

}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...