제출 #1231126

#제출 시각아이디문제언어결과실행 시간메모리
1231126alexander707070Naval battle (CEOI24_battle)C++20
6 / 100
1681 ms178080 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];
priority_queue< pair<int,int> , vector< pair<int,int> > , greater< pair<int,int> > > q;

char c;

int tim[MAXN];
vector<int> opt[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;

    if(curr<tim[x]){
        tim[x]=curr; opt[x]={y};
    }else if(curr==tim[x]){
        opt[x].push_back(y);
    }
}

void calculate(int i){
    tim[i]=inf; opt[i]={};

    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 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);
    }

    for(int i=1;i<=n;i++){
        calculate(i);
        q.push({tim[i],i});
    }

    while(!q.empty()){
        auto p=q.top();
        q.pop();

        if(dead[p.second] or p.first==inf)continue;

        dead[p.second]=true;
        rem(p.second);
        
        for(int i:opt[p.second]){
            dead[i]=true;
            rem(i);
        }

        for(int i:opt[p.second]){
            add(i);
            calculate(i);

            for(int f:opt[i]){
                calculate(f);
                q.push({tim[f],f});
            }

            rem(i);
        }

        add(p.second);
        calculate(p.second);

        for(int f:opt[p.second]){
            calculate(f);
            q.push({tim[f],f});
        }

        rem(p.second);
    }

    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...