제출 #1336018

#제출 시각아이디문제언어결과실행 시간메모리
1336018NValchanovNaval battle (CEOI24_battle)C++20
46 / 100
3117 ms790832 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

#define endl '\n'

using namespace std;

const int MAXN = 2e5 + 10;

struct Ship
{
    int x, y, dir;

    Ship(){};

    Ship(int x, int y, int dir)
    {
        this->x = x;
        this->y = y;
        this->dir = dir;
    }

    friend bool operator==(Ship s1, Ship s2)
    {
        return (s1.x == s2.x) && (s1.y == s2.y);
    }
};

struct Collision
{
    int t, idx1, idx2;

    Collision(){};

    Collision(int t, int idx1, int idx2)
    {
        this->t = t;
        this->idx1 = idx1;
        this->idx2 = idx2;
    }

    friend bool operator<(const Collision& c1, const Collision& c2)
    {
        return c1.t < c2.t;
    }
};

int n;
Ship s[MAXN];
bool sunk[MAXN];
int stime[MAXN];
vector < Collision > colls;

map < char, int > mp;

void read()
{
    mp['W'] = 0;
    mp['S'] = 1;
    mp['E'] = 2;
    mp['N'] = 3;

    cin >> n;

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

        s[i].dir = mp[c];
    }
}

int get_time(int i, int j)
{
    return (abs(s[i].x - s[j].x) + abs(s[i].y - s[j].y)) / 2;
}

Ship move(Ship& sh, int d)
{
    Ship result = sh;

    if(sh.dir == 0)
        result.x -= d;
    else if(sh.dir == 1)
        result.y += d;
    else if(sh.dir == 2)
        result.x += d;
    else
        result.y -= d;

    return result;
}

void solve()
{
    for(int i = 1; i <= n; i++)
    {
        for(int j = i + 1; j <= n; j++)
        {
            int t = get_time(i, j);

            Ship mi = move(s[i], t);
            Ship mj = move(s[j], t);

            if(move(s[i], t) == move(s[j], t))
                colls.push_back(Collision(t, i, j));
        }
    }

    sort(colls.begin(), colls.end());

    for(Collision& coll : colls)
    {
        int t = coll.t;
        int idx1 = coll.idx1;
        int idx2 = coll.idx2;

        if(sunk[idx1] && sunk[idx2])
            continue;

        if(!sunk[idx1] && !sunk[idx2])
        {
            sunk[idx1] = sunk[idx2] = true;
            stime[idx1] = stime[idx2] = t;

            continue;
        }

        if(sunk[idx1] && stime[idx1] == t)
        {
            sunk[idx2] = true;
            stime[idx2] = t;
        }
        else if(sunk[idx2] && stime[idx2] == t)
        {
            sunk[idx1] = true;
            stime[idx1] = t;
        }
    }

    for(int i = 1; i <= n; i++)
    {
        if(!sunk[i])
        {
            cout << i << endl;
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    read();
    solve();

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