9222 2024. 02. 18 19:00:22 Catt Labirintus cpp14 Elfogadva 100/100 744ms 79652 KiB
#include <bits/stdc++.h>
#include "labirintus.h"
using namespace std;

struct me {
    int p, s;
    pair<bool, bool> b;

    me(){}

    me(int _p, int _s, pair<bool, bool> _b) : p(_p), s(_s), b(_b){} 
};

map<int, me > memo;

int n,m;
vector<vector<int> > v;
vector<pair<int, int> > falak;

int postoind(pair<int, int> pos) {
    return pos.first * m + pos.second;
}

pair<int, int> indtopos(int ind) {
    return {ind / m, ind % m};
}

vector<int> p, s;
vector<pair<bool, bool> > block;

bool mo;

int holvan(int a){
    if(p[a] == a) return a;

    return (p[a] = holvan(p[a]));
}

int holvanslow(int a) {
    if(p[a] == a) return a;
    return holvanslow(p[a]);
}

bool init;
void unio(int a, int b) {
    if(!init)a = holvanslow(a);
    else a = holvan(a);
    if(!init)b = holvanslow(b);
    else b = holvan(b);

    if(a == b) return;

    if(s[a] < s[b]) swap(a, b);

    if(!init) {
        if(memo.find(a) == memo.end()) memo[a] = {a, s[a], block[a]}; 
        if(memo.find(b) == memo.end()) memo[b] = {b, s[b], block[b]}; 
    }
    p[b] = a;
    s[a] += s[b];
    block[a] = {block[a].first | block[b].first, block[a].second | block[b].second};
    if(block[a].first && block[a].second) mo = 1;
}


void init_labyrinth(int R, int C, vector<vector<int> > L) {
    init = 1;
    mo = 0;
    n = R;
    m = C;

    v.resize(n+1, vector<int>(m+1, 0));

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            v[i][j] = L[i][j];
            if(v[i][j]) falak.push_back({i, j});
        }
    }

    p.resize(n*m+1);
    s.resize(n*m+1, 1);
    block.resize(n*m+1, {0, 0});
    for(int i = 0; i < n*m; i++) p[i] = i;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            if(i == n-1 || j == 0) block[postoind({i, j})] = {1, 0};
            else if(i == 0 || j == m-1) block[postoind({i, j})] = {0, 1};
        }
    }

    for(auto fal : falak) {
        for(int i = -1; i <= 1; i++) {
            for(int j = -1; j <= 1; j++) {
                if(i == 0 && j == 0) continue;

                if(fal.first + i >= 0 && fal.second+j >= 0 && v[fal.first + i][fal.second + j]) {
                    unio(postoind(fal), postoind({fal.first+i, fal.second+j}));
                }
            }
        }
    }
    init = 0;
}

bool can_escape(int N, vector<int> U, vector<int> V){
    if(mo) return 0;

    for(int i = 0; i < N; i++) {
        pair<int, int> cur = {U[i], V[i]};

        for(int i = -1; i <= 1; i++) {
            for(int j = -1; j <= 1; j++) {
                if(i == 0 && j == 0) continue;

                if(cur.first + i >= 0 && cur.second+j >= 0 && v[cur.first + i][cur.second + j]) {
                    unio(postoind(cur), postoind({cur.first+i, cur.second+j}));
                }
            }
        }

        v[U[i]][V[i]] = 1;
    }


    /*map<int, vector<pair<int, int>> > comp;
    for(int i = 0; i < N; i++) {
        pair<int, int> cur = {U[i], V[i]};
        int ind = holvanslow(postoind(cur));
        comp[ind].push_back(cur);
    }
    //cout << "itt1" << endl;

    for(auto i: falak) {
        int ind = holvanslow(postoind(i));
        comp[ind].push_back(i);
    }

    for(auto i : comp) {
        cout << "component: \n";
        for(auto j : i.second) cout << j.first << ", "  << j.second << endl;
        cout << "-------------\n";
    }*/

    bool ret = !mo;
    mo = 0;

    for(int i = 0; i < N; i++) {
        pair<int, int> cur = {U[i], V[i]};
        int ind = postoind(cur);

        p[ind] = ind;
        s[ind] = 1;

        v[U[i]][V[i]] = 0;
    }

    for(auto i : memo) {
        p[i.first] = i.second.p; 
        s[i.first] = i.second.s;
        block[i.first] = i.second.b; 
    }

    memo.clear();

    return ret;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1960 KiB
2 Elfogadva 254ms 52788 KiB
subtask2 15/15
3 Elfogadva 79ms 4372 KiB
4 Elfogadva 8ms 4576 KiB
5 Elfogadva 250ms 3868 KiB
6 Elfogadva 244ms 3020 KiB
7 Elfogadva 194ms 4812 KiB
8 Elfogadva 194ms 4948 KiB
subtask3 18/18
9 Elfogadva 363ms 4260 KiB
10 Elfogadva 400ms 3564 KiB
11 Elfogadva 592ms 55924 KiB
12 Elfogadva 579ms 58268 KiB
13 Elfogadva 587ms 60152 KiB
14 Elfogadva 588ms 61976 KiB
subtask4 28/28
15 Elfogadva 455ms 62516 KiB
16 Elfogadva 460ms 64064 KiB
17 Elfogadva 469ms 65724 KiB
18 Elfogadva 207ms 65956 KiB
19 Elfogadva 433ms 67084 KiB
20 Elfogadva 148ms 66012 KiB
21 Elfogadva 136ms 66004 KiB
22 Elfogadva 437ms 67172 KiB
23 Elfogadva 437ms 67172 KiB
subtask5 39/39
24 Elfogadva 45ms 16612 KiB
25 Elfogadva 23ms 16416 KiB
26 Elfogadva 250ms 17452 KiB
27 Elfogadva 244ms 16644 KiB
28 Elfogadva 246ms 16912 KiB
29 Elfogadva 244ms 16644 KiB
30 Elfogadva 583ms 69252 KiB
31 Elfogadva 566ms 70772 KiB
32 Elfogadva 744ms 69824 KiB
33 Elfogadva 591ms 73556 KiB
34 Elfogadva 361ms 73764 KiB
35 Elfogadva 370ms 73720 KiB
36 Elfogadva 569ms 74856 KiB
37 Elfogadva 500ms 76456 KiB
38 Elfogadva 651ms 78020 KiB
39 Elfogadva 490ms 79652 KiB