Submission #1296845

#TimeUsernameProblemLanguageResultExecution timeMemory
1296845malmoNaval battle (CEOI24_battle)C++20
0 / 100
1 ms348 KiB
#include <bits/stdc++.h>

using namespace std;

using pii=pair<int, int>;
using pipii=pair<int, pii>;

pipii makePipii(int v1, int v2, int v3){
    pipii ret;
    ret.first=v1;
    ret.second.first=v2;
    ret.second.second=v3;
    return ret;
}

pair<bool, int> trovaScontro(char dir1, pii pos1, char dir2, pii pos2){
    const pair<bool, int> noScontro={false, -1};
    if(dir1==dir2) return noScontro;
    if(dir1=='E'){
        if(dir2=='W'){
            if(pos1.second==pos2.second && pos1.first<pos2.first) return {true, (pos2.first-pos1.first)/2};
            else return noScontro;
        }else if(dir2=='N'){
            pii intersez={pos2.first, pos1.second};
            int time1=intersez.first-pos1.first;
            int time2=pos2.second-intersez.second;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }else if(dir2=='S'){
            pii intersez={pos2.first, pos1.second};
            int time1=intersez.first-pos1.first;
            int time2=intersez.second-pos2.second;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }
    }else if(dir1=='W'){
        if(dir2=='E'){
            if(pos1.second==pos2.second && pos2.first<pos1.first) return {true, (pos1.first-pos2.first)/2};
            else return noScontro;
        }else if(dir2=='N'){
            pii intersez={pos2.first, pos1.second};
            int time1=pos1.first-intersez.first;
            int time2=pos2.second-intersez.second;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }else if(dir2=='S'){
            pii intersez={pos2.first, pos1.second};
            int time1=pos1.first-intersez.first;
            int time2=intersez.second-pos2.second;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }
    }else if(dir1=='N'){
        if(dir2=='S'){
            if(pos1.first==pos2.first && pos2.second<pos1.second) return {true, (pos1.second-pos2.second)/2};
            else return noScontro;
        }else if(dir2=='E'){
            pii intersez={pos1.first, pos2.second};
            int time1=pos1.second-intersez.second;
            int time2=intersez.first-pos2.first;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }else if(dir2=='W'){
            pii intersez={pos1.first, pos2.second};
            int time1=pos1.second-intersez.second;
            int time2=pos2.first-intersez.first;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }
    }else if(dir1=='S'){
        if(dir2=='N'){
            if(pos1.first==pos2.first && pos1.second<pos2.second) return {true, (pos2.second-pos1.second)/2};
            else return noScontro;
        }else if(dir2=='E'){
            pii intersez={pos1.first, pos2.second};
            int time1=intersez.second-pos1.second;
            int time2=intersez.first-pos2.first;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }else if(dir2=='W'){
            pii intersez={pos1.first, pos2.second};
            int time1=intersez.second-pos1.second;
            int time2=pos2.first-intersez.first;
            if(time1==time2 && time1>0) return {true, time1};
            else return noScontro;
        }
    }
}

vector<int> affonda(int N, vector<int> X, vector<int> Y, vector<char> D){
    vector<pipii> scontri;
    for(int i=0; i<N; i++){
        char direzioneAtt=D[i];
        pii posAtt={X[i], Y[i]};
        for(int j=i+1; j<N; j++){
            char direzione2=D[j];
            pii pos2={X[j], Y[j]};
            pair<bool, int> result=trovaScontro(direzioneAtt, posAtt, direzione2, pos2);
            if(result.first){
                scontri.push_back(makePipii(result.second, i, j));
            }
        }
    }
    sort(scontri.begin(), scontri.end());
    vector<bool> isAlive(N, true);
    int currTime=0;
    set<int> toKill;
    for(int i=0; i<scontri.size(); i++){
        int n1=scontri[i].second.first, n2=scontri[i].second.second;
        if(scontri[i].first!=currTime){
            currTime=scontri[i].first;
            for(int nave : toKill) isAlive[nave]=false;
            toKill.erase(toKill.begin(), toKill.end());
        }
        if(isAlive[n1] && isAlive[n2]){
            toKill.insert(n1);
            toKill.insert(n2);
        }
    }
    for(int nave : toKill) isAlive[nave]=false;
    vector<int> ans;
    for(int i=0; i<N; i++){
        if(isAlive[i]) ans.push_back(i+1);
    }
    return ans;
}

int main() {
    ifstream cin("input.txt");
    ios_base::sync_with_stdio(false); cin.tie(nullptr);

    int N; cin >> N;
    vector<int> X(N), Y(N);
    vector<char> D(N);

    for (int i = 0; i < N; i++)
        cin >> X[i] >> Y[i] >> D[i];

    vector<int> ans = affonda(N, X, Y, D);
	sort(begin(ans), end(ans));
    for (auto x: ans)
        cout << x << '\n';
}

Compilation message (stderr)

Main.cpp: In function 'std::pair<bool, int> trovaScontro(char, pii, char, pii)':
Main.cpp:88:1: warning: control reaches end of non-void function [-Wreturn-type]
   88 | }
      | ^
#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...