제출 #1231115

#제출 시각아이디문제언어결과실행 시간메모리
1231115alexander707070Naval battle (CEOI24_battle)C++20
46 / 100
3100 ms133952 KiB
#include<bits/stdc++.h>
#define MAXN 200007
using namespace std;

const int inf=2e9;

struct ship{
    int x,y,id;
    int type;
}s[MAXN];

/*
 1
4X2
 3

*/

int n;
unordered_map< int , set<pair<int,int> > > raz[5],sum[5],xs[5],ys[5];
char c;

int tim[MAXN];
bool dead[MAXN];

void add(int i){
    xs[s[i].type][s[i].x].insert({s[i].y,i});
    ys[s[i].type][s[i].y].insert({s[i].x,i});

    sum[s[i].type][s[i].x+s[i].y].insert({s[i].x-s[i].y,i});
    raz[s[i].type][s[i].x-s[i].y].insert({s[i].x+s[i].y,i});
}

void rem(int i){
    xs[s[i].type][s[i].x].erase({s[i].y,i});
    ys[s[i].type][s[i].y].erase({s[i].x,i});

    sum[s[i].type][s[i].x+s[i].y].erase({s[i].x-s[i].y,i});
    raz[s[i].type][s[i].x-s[i].y].erase({s[i].x+s[i].y,i});
}

void check(int x,int y){
    int curr=max(abs(s[x].x-s[y].x),abs(s[x].y-s[y].y));
    if( abs(s[x].type-s[y].type)==2 )curr/=2;

    tim[x]=min(tim[x],curr);
}

bool calc(){
    for(int i=1;i<=n;i++)tim[i]=inf;

    for(int i=1;i<=n;i++){
        if(dead[i])continue;

        if(s[i].type==1){
            auto it=xs[3][s[i].x].lower_bound({s[i].y,0});
            
            if(it!=xs[3][s[i].x].end()){
                auto p=*it;
                check(i,p.second);
            }

            it=raz[4][s[i].x-s[i].y].lower_bound({s[i].x+s[i].y,0});

            if(it!=raz[4][s[i].x-s[i].y].end()){
                auto p=*it;
                check(i,p.second);
            }

            it=sum[2][s[i].x+s[i].y].lower_bound({s[i].x-s[i].y,0});

            if(it!=sum[2][s[i].x+s[i].y].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }

        }else if(s[i].type==3){

            auto it=xs[1][s[i].x].lower_bound({s[i].y,0});
            
            if(it!=xs[1][s[i].x].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }

            it=raz[2][s[i].x-s[i].y].lower_bound({s[i].x+s[i].y,0});

            if(it!=raz[2][s[i].x-s[i].y].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }

            it=sum[4][s[i].x+s[i].y].lower_bound({s[i].x-s[i].y,0});

            if(it!=sum[4][s[i].x+s[i].y].end()){
                auto p=*it;
                check(i,p.second);
            }
        }else if(s[i].type==2){
            auto it=ys[4][s[i].y].lower_bound({s[i].x,0});
            
            if(it!=ys[4][s[i].y].end()){
                auto p=*it;
                check(i,p.second);
            }

            it=raz[3][s[i].x-s[i].y].lower_bound({s[i].x+s[i].y,0});

            if(it!=raz[3][s[i].x-s[i].y].end()){
                auto p=*it;
                check(i,p.second);
            }

            it=sum[1][s[i].x+s[i].y].lower_bound({s[i].x-s[i].y,0});

            if(it!=sum[1][s[i].x+s[i].y].end()){
                auto p=*it;
                check(i,p.second);
            }
        }else if(s[i].type==4){
            auto it=ys[2][s[i].y].lower_bound({s[i].x,0});
            
            if(it!=ys[2][s[i].y].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }

            it=raz[1][s[i].x-s[i].y].lower_bound({s[i].x+s[i].y,0});

            if(it!=raz[1][s[i].x-s[i].y].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }

            it=sum[3][s[i].x+s[i].y].lower_bound({s[i].x-s[i].y,0});
            if(it!=sum[3][s[i].x+s[i].y].begin()){
                it--; auto p=*it;
                check(i,p.second);
            }
        }
    }

    int mins=inf;
    for(int i=1;i<=n;i++){
        mins=min(mins,tim[i]);
    }

    if(mins==inf)return false;

    for(int i=1;i<=n;i++){
        if(tim[i]!=mins)continue;

        dead[i]=true;
        rem(i);
    }

    return true;
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>s[i].x>>s[i].y>>c;
        s[i].id=i;

        if(c=='N')s[i].type=3;
        if(c=='E')s[i].type=2;
        if(c=='S')s[i].type=1;
        if(c=='W')s[i].type=4;

        add(i);
    }

    while(calc());

    for(int i=1;i<=n;i++){
        if(!dead[i])cout<<i<<"\n";
    }

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