53952023-05-09 14:12:07mraronLabirintuscpp17Elfogadva 100/100439ms43344 KiB
#include "labirintus.h"
#include <algorithm>

using namespace std;

int M, R, C;
vector<vector<int>> labyrinth;
vector<int> sz, par;
vector<pair<int,int>> hist;

int find_par(int x) {
    return x==par[x] ? x : find_par(par[x]);
}

void unite(int r1, int c1, int r2, int c2, bool save=false) {
    int x = r1*C+c1, y;
    if (r2<0 || r2>=R) y = (r2==R ? M-2 : M-1);
    else if (c2<0 || c2>=C) y = (c2==C ? M-1 : M-2);
    else y = r2*C+c2;

    x = find_par(x), y = find_par(y);
    if (x==y) return;
    if (sz[x] < sz[y]) swap(x,y);
    sz[x] += sz[y];
    par[y] = x;
    if (save) hist.push_back({x, y});
}

void init_labyrinth(int _R, int _C, std::vector<std::vector<int>> L) {
    R = _R, C = _C;
    labyrinth = L;
    M = R*C+2;
    sz.assign(M, 1), par.resize(M);
    for (int i=0; i<M; ++i) par[i] = i;
    for (int i=0; i<R; ++i) {
        for (int j=0; j<C; ++j) {
            if (labyrinth[i][j] == 0) continue;
            for (int x=i-1; x<=i+1; ++x)
                for (int y=j-1; y<=j+1; ++y)
                    if (x<0 || x>=R || y<0 || y>=C || labyrinth[x][y] == 1)
                        unite(i,j, x,y);
        }
    }
}

bool can_escape(int N, std::vector<int> U, std::vector<int> V) {
    hist.clear();
    for (int k=0; k<N; ++k) {
        int i = U[k], j = V[k];
        for (int x=i-1; x<=i+1; ++x)
            for (int y=j-1; y<=j+1; ++y)
                if (x<0 || x>=R || y<0 || y>=C || labyrinth[x][y] == 1) 
                    unite(i,j, x,y, true);
        labyrinth[i][j] = 1;
    }
    bool ans = (find_par(M-2) != find_par(M-1));
    reverse(hist.begin(), hist.end());
    for (auto [x,y] : hist) {
        par[y] = y;
        sz[x] -= sz[y];
    }
    for (int k=0; k<N; ++k) {
        labyrinth[U[k]][V[k]] = 0;
    }

    return ans;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1328 KiB
2Elfogadva178ms40500 KiB
subtask215/15
3Elfogadva32ms3180 KiB
4Elfogadva8ms3396 KiB
5Elfogadva115ms2892 KiB
6Elfogadva115ms2608 KiB
7Elfogadva81ms3800 KiB
8Elfogadva82ms4164 KiB
subtask318/18
9Elfogadva209ms3684 KiB
10Elfogadva182ms3084 KiB
11Elfogadva416ms41684 KiB
12Elfogadva402ms42024 KiB
13Elfogadva398ms41976 KiB
14Elfogadva439ms42076 KiB
subtask428/28
15Elfogadva257ms42412 KiB
16Elfogadva259ms42632 KiB
17Elfogadva263ms42576 KiB
18Elfogadva150ms42704 KiB
19Elfogadva252ms42636 KiB
20Elfogadva120ms42592 KiB
21Elfogadva122ms42920 KiB
22Elfogadva250ms42604 KiB
23Elfogadva246ms42864 KiB
subtask539/39
24Elfogadva35ms3960 KiB
25Elfogadva17ms3868 KiB
26Elfogadva115ms4420 KiB
27Elfogadva115ms3960 KiB
28Elfogadva115ms4184 KiB
29Elfogadva115ms3968 KiB
30Elfogadva432ms42984 KiB
31Elfogadva402ms43036 KiB
32Elfogadva275ms43032 KiB
33Elfogadva405ms43236 KiB
34Elfogadva229ms43316 KiB
35Elfogadva228ms43276 KiB
36Elfogadva310ms43180 KiB
37Elfogadva287ms43180 KiB
38Elfogadva294ms43244 KiB
39Elfogadva289ms43344 KiB