10649 2024. 04. 07 18:13:26 Valaki2 Labirintus cpp17 Elfogadva 100/100 560ms 72992 KiB
#include "labirintus.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

const int maxn = 1000;

vector<pii > directions = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};

int n, m;
bool wall[1 + maxn + 1][1 + maxn + 1];

pii par[1 + maxn + 1][1 + maxn + 1];
int sz[1 + maxn + 1][1 + maxn + 1];

pii par_ori[1 + maxn + 1][1 + maxn + 1];
int sz_ori[1 + maxn + 1][1 + maxn + 1];

pii find_set_compress(pii cur) {
    if(cur == par[cur.fi][cur.se]) {
        return cur;
    }
    return par[cur.fi][cur.se] = find_set_compress(par[cur.fi][cur.se]);
}

void union_sets_compress(pii cur, pii nei) {
    cur = find_set_compress(cur), nei = find_set_compress(nei);
    if(cur == nei) {
        return;
    }
    if(sz[cur.fi][cur.se] > sz[nei.fi][nei.se]) {
        swap(cur, nei);
    }
    par[cur.fi][cur.se] = nei;
    sz[nei.fi][nei.se] += sz[cur.fi][cur.se];
}

void init_labyrinth(int R, int C, vector<vector<int> > L) {
    n = R, m = C;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(L[i - 1][j - 1] == 1) {
                wall[i][j] = true;
            }
        }
    }
    for(int i = 2; i <= n + 1; i++) {
        wall[i][0] = true;
    }
    for(int i = 0; i <= n - 1; i++) {
        wall[i][m + 1] = true;
    }
    for(int j = 2; j <= m + 1; j++) {
        wall[0][j] = true;
    }
    for(int j = 0; j <= m - 1; j++) {
        wall[n + 1][j] = true;
    }
    /*for(int i = 0; i <= n + 1; i++) {
        for(int j = 0; j <= m + 1; j++) {
            cout << wall[i][j];
        }
        cout << "\n";
    }*/
    for(int i = 0; i <= n + 1; i++) {
        for(int j = 0; j <= m + 1; j++) {
            par[i][j] = mp(i, j);
            sz[i][j] = 1;
        }
    }
    for(int i = 0; i <= n + 1; i++) {
        for(int j = 0; j <= m + 1; j++) {
            if(!wall[i][j]) {
                continue;
            }
            for(pii d : directions) {
                int a = i + d.fi, b = j + d.se;
                if(a >= 0 && a <= n + 1 && b >= 0 && b <= m + 1 && wall[a][b]) {
                    union_sets_compress(mp(i, j), mp(a, b));
                }
            }
        }
    }
    for(int i = 0; i <= n + 1; i++) {
        for(int j = 0; j <= m + 1; j++) {
            find_set_compress(mp(i, j));
        }
    }
    for(int i = 0; i <= n + 1; i++) {
        for(int j = 0; j <= m + 1; j++) {
            par_ori[i][j] = par[i][j];
            sz_ori[i][j] = sz[i][j];
        }
    }
}

vector<pii > changes;

pii find_set(pii cur) {
    if(cur == par[cur.fi][cur.se]) {
        return cur;
    }
    changes.pb(cur);
    return par[cur.fi][cur.se] = find_set(par[cur.fi][cur.se]);
}

void union_sets(pii cur, pii nei) {
    cur = find_set(cur), nei = find_set(nei);
    if(cur == nei) {
        return;
    }
    if(sz[cur.fi][cur.se] > sz[nei.fi][nei.se]) {
        swap(cur, nei);
    }
    par[cur.fi][cur.se] = nei;
    sz[nei.fi][nei.se] += sz[cur.fi][cur.se];
    changes.pb(cur);
    changes.pb(nei);
}

bool guard[1 + maxn + 1][1 + maxn + 1];

bool can_escape(int N, vector<int> U, vector<int> V) {
    for(int i = 0; i < N; i++) {
        guard[U[i] + 1][V[i] + 1] = true;
    }
    for(int i = 0; i < N; i++) {
        int x = U[i], y = V[i];
        x++;
        y++;
        for(pii d : directions) {
            int a = x + d.fi, b = y + d.se;
            if(wall[a][b] || guard[a][b]) {
                union_sets(mp(x, y), mp(a, b));
            }
        }
    }
    bool ans = !(find_set(mp(0, 2)) == find_set(mp(2, 0)));
    for(pii p : changes) {
        par[p.fi][p.se] = par_ori[p.fi][p.se];
        sz[p.fi][p.se] = sz_ori[p.fi][p.se];
    }
    for(int i = 0; i < N; i++) {
        guard[U[i] + 1][V[i] + 1] = false;
    }
    changes.clear();
    return ans;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 2032 KiB
2 Elfogadva 222ms 66712 KiB
subtask2 15/15
3 Elfogadva 43ms 11280 KiB
4 Elfogadva 10ms 11344 KiB
5 Elfogadva 155ms 7328 KiB
6 Elfogadva 155ms 4848 KiB
7 Elfogadva 111ms 12216 KiB
8 Elfogadva 112ms 12112 KiB
subtask3 18/18
9 Elfogadva 289ms 39560 KiB
10 Elfogadva 233ms 3464 KiB
11 Elfogadva 560ms 67540 KiB
12 Elfogadva 517ms 67664 KiB
13 Elfogadva 536ms 67624 KiB
14 Elfogadva 560ms 67624 KiB
subtask4 28/28
15 Elfogadva 351ms 67748 KiB
16 Elfogadva 354ms 67748 KiB
17 Elfogadva 365ms 67816 KiB
18 Elfogadva 195ms 67828 KiB
19 Elfogadva 340ms 68112 KiB
20 Elfogadva 146ms 68056 KiB
21 Elfogadva 153ms 68304 KiB
22 Elfogadva 337ms 68264 KiB
23 Elfogadva 337ms 68392 KiB
subtask5 39/39
24 Elfogadva 50ms 4348 KiB
25 Elfogadva 25ms 4248 KiB
26 Elfogadva 155ms 8656 KiB
27 Elfogadva 155ms 6032 KiB
28 Elfogadva 153ms 6516 KiB
29 Elfogadva 155ms 6104 KiB
30 Elfogadva 550ms 68428 KiB
31 Elfogadva 510ms 68560 KiB
32 Elfogadva 386ms 68556 KiB
33 Elfogadva 542ms 68704 KiB
34 Elfogadva 291ms 68700 KiB
35 Elfogadva 284ms 68556 KiB
36 Elfogadva 535ms 68812 KiB
37 Elfogadva 444ms 68836 KiB
38 Elfogadva 479ms 72992 KiB
39 Elfogadva 442ms 68836 KiB