Submission #1104534

#TimeUsernameProblemLanguageResultExecution timeMemory
1104534HiepVu217Naval battle (CEOI24_battle)C++17
46 / 100
268 ms29360 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 17;
int n, sank[N];
pair <int, int> ship[N];
char dir[N];
vector <tuple <int, int, int>> vtp;
void collide (int i, int j)
{
    char d1 = dir[i], d2 = dir[j];
    auto [x1, y1] = ship[i];
    auto [x2, y2] = ship[j];
    int w = (abs (x1 - x2) + abs (y1 - y2)) / 2;
    if (d1 == 'N')
    {
        if (d2 == 'S' && y1 - y2 == w * 2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'E' && x2 + w == x1 && y1 - w == y2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'W' && x2 - w == x1 && y1 - w == y2)
        {
            vtp.push_back ({w, i, j});
        }
    }
    if (d1 == 'S')
    {
        if (d2 == 'N' && y2 - y1 == w * 2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'E' && x2 + w == x1 && y1 + w == y2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'W' && x2 - w == x1 && y1 + w == y2)
        {
            vtp.push_back ({w, i, j});
        }
    }
    if (d1 == 'E')
    {
        if (d2 == 'W' && x2 - x1 == w * 2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'N' && x1 + w == x2 && y2 - w == y1)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'S' && x1 + w == x2 && y2 + w == y1)
        {
            vtp.push_back ({w, i, j});
        }
    }
    if (d1 == 'W')
    {
        if (d2 == 'E' && x1 - x2 == w * 2)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'N' && x1 - w == x2 && y2 - w == y1)
        {
            vtp.push_back ({w, i, j});
        }
        if (d2 == 'S' && x1 - w == x2 && y2 + w == y1)
        {
            vtp.push_back ({w, i, j});
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        cin >> ship[i].first >> ship[i].second >> dir[i];
    }
    if (1LL * n * (n - 1) / 2 <= 1e8)
    {
        for (int i = 1; i < n; ++i)
        {
            for (int j = i + 1; j <= n; ++j)
            {
                collide (i, j);
            }
        }
        sort (vtp.begin(), vtp.end());
        for (auto [w, u, v]: vtp)
        {
            if (!sank[u] && !sank[v])
            {
                sank[u] = sank[v] = w;
            }
            if (!sank[u] && sank[v] == w)
            {
                sank[u] = w;
            }
            if (!sank[v] && sank[u] == w)
            {
                sank[v] = w;
            }
        }
        for (int i = 1; i <= n; ++i)
        {
            if (!sank[i])
            {
                cout << i << "\n";
            }
        }
    }
}
#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...