92172024-02-18 18:15:46CattLabirintuscpp14Hibás válasz 0/1002.088s87392 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;
set<pair<int, int> > falak, orok;

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 holvan(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;

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            if(L[i][j]) falak.insert({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};
            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(falak.find({fal.first+i, fal.second+j}) != falak.end()) {
                    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(falak.find({cur.first+i, cur.second+j}) != falak.end()) {
                    unio(postoind(cur), postoind({cur.first+i, cur.second+j}));
                }

                if(orok.find({cur.first+i, cur.second+j}) != orok.end()) {
                    unio(postoind(cur), postoind({cur.first+i, cur.second+j}));
                }
            }
        }

        orok.insert(cur);
    }

    /*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;
    }

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

    memo.clear();
    orok.clear();

    return ret;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1752 KiB
2Hibás válasz1.363s83576 KiB
subtask20/15
3Hibás válasz230ms5348 KiB
4Hibás válasz25ms5204 KiB
5Elfogadva545ms3840 KiB
6Elfogadva522ms2728 KiB
7Elfogadva875ms5712 KiB
8Hibás válasz879ms6044 KiB
subtask30/18
9Hibás válasz939ms4088 KiB
10Hibás válasz1.009s3536 KiB
11Időlimit túllépés2.062s43408 KiB
12Időlimit túllépés2.065s43672 KiB
13Időlimit túllépés2.075s44004 KiB
14Időlimit túllépés2.069s44088 KiB
subtask40/28
15Időlimit túllépés2.052s40780 KiB
16Időlimit túllépés2.088s41008 KiB
17Időlimit túllépés2.065s41336 KiB
18Elfogadva1.432s79236 KiB
19Időlimit túllépés2.061s44616 KiB
20Elfogadva940ms79576 KiB
21Elfogadva945ms79684 KiB
22Időlimit túllépés2.069s45180 KiB
23Időlimit túllépés2.069s45132 KiB
subtask50/39
24Elfogadva64ms5052 KiB
25Elfogadva32ms5176 KiB
26Elfogadva545ms6480 KiB
27Elfogadva523ms5444 KiB
28Elfogadva524ms5660 KiB
29Elfogadva522ms5504 KiB
30Időlimit túllépés2.035s45452 KiB
31Időlimit túllépés2.081s45648 KiB
32Időlimit túllépés2.04s41356 KiB
33Időlimit túllépés2.069s45844 KiB
34Hibás válasz1.804s87380 KiB
35Hibás válasz1.789s87392 KiB
36Időlimit túllépés2.078s42264 KiB
37Időlimit túllépés2.065s42208 KiB
38Időlimit túllépés2.072s44588 KiB
39Időlimit túllépés2.068s42864 KiB