Submission #1080452

#TimeUsernameProblemLanguageResultExecution timeMemory
1080452antonNaval battle (CEOI24_battle)C++17
6 / 100
1444 ms1048576 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int, int>
#define pt complex<int>

const int INF = 1e18;


int nz(int a){
    if(a==0){
        return 1;
    }
    else{
        return 0;
    }
}
struct Ship{
    pt pos;
    pt dir;

    pt stable_cord(){
        return {pos.real()*nz(dir.real()), pos.imag()*nz(dir.imag())};
    }
};

map<char, pt> dirs ={{'E', {1, 0}}, {'W', {-1, 0}}, {'S', {0, 1}}, {'N', {0, -1}}};



pair<pt, int> intersect(Ship a, Ship b){
    if(a.dir == b.dir){
        return {0, INF};
    }
    else{
        pt inter_pos = 0;

        if(a.dir == -b.dir && a.stable_cord() == b.stable_cord()){
            inter_pos = (a.pos+b.pos)/2LL;
        }
        else{
            inter_pos = a.stable_cord()+b.stable_cord();
        }
        int t = abs(a.pos-inter_pos);
        if(a.pos+t*a.dir == inter_pos && b.pos+t*b.dir == inter_pos){
            return {inter_pos, t};
        }
        return {0, INF};
    }
}
int N;
signed main(){
    cin>>N;


    vector<Ship> shipd;
    for(int i = 0; i<N; i++){
        pii pos;
        cin>>pos.first>>pos.second;
        char dir;
        cin>>dir;
        shipd.push_back(Ship{{pos.first, pos.second}, dirs[dir]});
    }

    /*auto cmp = [&](pair<pt, int>& a, pair<pt, int>& b){
        return a.second>b.second;
    };*/
    vector<pair<int, pii>> inters;

    vector<int> killed(N, INF);
    int nb_alive= N;
    for(int i = 0; i<N; i++){
        for(int j = i+1; j<N; j++){
            inters.push_back({-intersect(shipd[i], shipd[j]).second, {i, j}});
        }
    }
    sort(inters.begin(), inters.end());

    for(int i = 0; i<inters.size(); i++){
        auto cur = inters[i];
        cur.first *= -1;

        int t=  cur.first;

        if(killed[cur.second.first]>=t &&killed[cur.second.second]>= t){
            //cout<<cur.first<<" "<<cur.second.first+1<<" "<<cur.second.second+1<<endl;
            killed[cur.second.first]= t;
            killed[cur.second.second]= t;
            nb_alive -=2;
        }
    }

    for(int i = 0; i<N; i++){
        if(killed[i]== INF){
            cout<<i+1<<endl;
        }
    }
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:80:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for(int i = 0; i<inters.size(); i++){
      |                    ~^~~~~~~~~~~~~~
#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...