Submission #1137583

#TimeUsernameProblemLanguageResultExecution timeMemory
1137583Ghulam_JunaidNaval battle (CEOI24_battle)C++20
76 / 100
426 ms25944 KiB
#include <bits/stdc++.h>
using namespace std;

#define F first
#define S second

const int N = 5005;
int n, dead[N];

map<char, int> mp;
map<int, vector<pair<int, int>>> diag;
int dx[4] = {0, 1,  0, -1};
int dy[4] = {1, 0, -1,  0};
char dir[4] = {'S', 'E', 'N', 'W'};

vector<pair<int, pair<int, int>>> edges, arr;

pair<int, int> move(int i, int m){
    return {arr[i].S.F + dx[arr[i].F] * m, arr[i].S.S + dy[arr[i].F] * m};
}

int get_time(int i, int j){
    if (arr[i].F == arr[j].F) return -1;

    int X = abs(arr[i].S.F - arr[j].S.F);
    int Y = abs(arr[i].S.S - arr[j].S.S);

    if ((arr[i].F + 2) % 4 == arr[j].F)
        X /= 2, Y /= 2;

    auto [xi, yi] = move(i, max(X, Y));
    auto [xj, yj] = move(j, max(X, Y));
    if (xi == xj and yi == yj) return max(X, Y);
    return -1;
}

int main(){
    mp['S'] = 0, mp['E'] = 1, mp['N'] = 2, mp['W'] = 3;

    cin >> n;
    if (n <= 5000){
        for (int i = 0; i < n; i ++){
            dead[i] = 2e9;

            int x, y;
            char c;
            cin >> x >> y >> c;
            arr.push_back({mp[c], {x, y}});
            for (int j = 0; j < i; j ++){
                int t = get_time(i, j);
                if (t == -1) continue;
                edges.push_back({t, {i, j}});
            }
        }

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

        for (int i = 0; i < edges.size(); i ++){
            int j = i;
            while (j + 1 < edges.size() and edges[j + 1].F == edges[i].F)
                j++;

            for (int k = i; k <= j; k ++){
                auto [t, P] = edges[k];
                auto [x, y] = P;
                if (dead[x] < t or dead[y] < t) continue;
                dead[x] = dead[y] = t;
            }
            i = j;
        }

        for (int i = 0; i < n; i ++)
            if (dead[i] == 2e9)
                cout << i + 1 << endl;

        return 0;
    }
    
    for (int i = 0; i < n; i ++){
        int x, y;
        char c;
        cin >> x >> y >> c;
        arr.push_back({mp[c], {x, y}});
        diag[x + y].push_back({x, i});
    }

    for (auto [di, vec] : diag){
        sort(vec.begin(), vec.end());
        vector<int> east_guys;
        for (int i = 0; i < vec.size(); i ++){
            auto [x, ind] = vec[i];
            auto [c, P] = arr[ind];

            if (c == 0){
                if (east_guys.size())
                    east_guys.pop_back();
                else
                    cout << ind + 1 << endl;
            }
            else{
                east_guys.push_back(ind);
            }
        }

        for (int x : east_guys)
            cout << x + 1 << endl;
    }
}
#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...