Submission #746537

#TimeUsernameProblemLanguageResultExecution timeMemory
746537ThMinh_Maze (JOI23_ho_t3)C++14
100 / 100
1665 ms434868 KiB
#include<bits/stdc++.h>
#define forin(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int N = 6e6 + 10;
int r, c, n, x, y, u, v, dp;
int row[4] = {0, -1, 0, 1};
int col[4] = {1, 0, -1, 0};
string s[N];
vector<vector<int>> f, par1, par2, vis, red;
queue<pair<int, int>> tmp;
void create(vector<vector<int>> &a) {
    a.resize(r + 2);
    forin(i,1,r + 1) a[i].resize(c + 2);
}
int root1(int i, int j) {
    return (par1[i][j] == j) ? j : par1[i][j] = root1(i, par1[i][j]);
}
int root2(int i, int j) {
    return (par2[i][j] == i) ? i : par2[i][j] = root2(par2[i][j], j);
}
bool check(int i, int j) {
    if(i < 1 || r < i || j < 1 || c < j) return 0;
    return 1;
}
void up(int x, int y) {
    if(!check(x, y)) return;
    if(f[x][y]) return;
    f[x][y] = dp + 1;
    par1[x][y] = y + 1;
    par2[x][y] = x + 1;
    tmp.push({x, y});
}
void bfs(int x, int y, queue<pair<int, int>> &p) {
    queue<pair<int, int>> q;
    q.push({x, y});
    while(!q.empty()) {
        int x1, y1; tie(x1, y1) = q.front(); q.pop();
        f[x1][y1] = dp;
        forin(k,0,3) {
            int u1 = x1 + row[k];
            int v1 = y1 + col[k];
            if(!check(u1, v1) || red[u1][v1]) continue;
            if(s[u1][v1] != '.' && f[u1][v1] != dp) continue;
            red[u1][v1] = 1;
            if(s[u1][v1] == '.') up(u1, v1);
            p.push({u1, v1});
            q.push({u1, v1});
        }
    }
}
int main () {
    cin.tie(0)->sync_with_stdio(0);
    if(fopen("Task.inp","r")) {
        freopen("Task.inp","r",stdin);
        freopen("WA.out","w",stdout);
    }
    cin>>r>>c>>n;
    create(f);
    create(vis);
    create(red);
    cin>>x>>y;
    cin>>u>>v;
    forin(i,1,r) {
        cin>>s[i];
        s[i] = " " + s[i];
    }
    create(par1);
    create(par2);
    forin(i,1,r + 1) forin(j,1,c + 1) {
        par1[i][j] = j;
        par2[i][j] = i;
    }
    up(x, y);
    while(true) {
        dp++;
        queue<pair<int, int>> q;
        while(!tmp.empty()) {
            int x1, y1; tie(x1, y1) = tmp.front(); tmp.pop();
            if(red[x1][y1]) continue;
            red[x1][y1] = 1;
            q.push({x1, y1});
            bfs(x1, y1, q);
        }
        while(!q.empty()) {
            int x1, y1; tie(x1, y1) = q.front(); q.pop();
            vis[x1][y1] = 1;
            vector<int> vt;
            forin(k,0,3) {
                int u1 = x1 + row[k];
                int v1 = y1 + col[k];
                if(!check(u1, v1) || !vis[u1][v1]) continue;
                vt.push_back(k);
            }
            if(vt.empty()) {
                forin(i,-n,n) forin(j,-n,n) if(!(abs(i) == n && abs(j) == n) && check(x1 + i, y1 + j)) {
                    up(x1 + i, y1 + j);
                }
            }
            else if(vt.size() == 1) {
                int k = vt[0];
                int t = - (row[k] + col[k]);
                if(row[k]) {
                    up(x1 + t * (n - 1), y1 + n);
                    up(x1 + t * (n - 1), y1 - n);
                    int u1 = x1 + t * n;
                    int v1 = max(1, y1 - n + 1);
                    if(!check(u1, v1)) continue;
                    while(true) {
                        v1 = root1(u1, v1);
                        if(v1 > min(c, y1 + n - 1)) break;
                        up(u1, v1);
                    }
                }
                else {
                    up(x1 + n, y1 + t * (n - 1));
                    up(x1 - n, y1 + t * (n - 1));
                    int u1 = max(1, x1 - n + 1);
                    int v1 = y1 + t * n;
                    if(!check(u1, v1)) continue;
                    while(true) {
                        u1 = root2(u1, v1);
                        if(u1 > min(r, x1 + n - 1)) break;
                        up(u1, v1);
                    }
                }
            }
            else if(vt.size() == 2 && (vt[0] - vt[1]) % 2) {
                    if(vt[0] % 2) swap(vt[0], vt[1]);
                    int t1 = - (row[vt[1]] + col[vt[1]]);
                    int t2 = - (row[vt[0]] + col[vt[0]]);
                    up(x1 + t1 * (n - 1), y1 + n);
                    up(x1 + t1 * (n - 1), y1 - n);
                    up(x1 + n, y1 + t2 * (n - 1));
                    up(x1 - n, y1 + t2 * (n - 1));
            }
            else {
                forin(k,0,3) up(x1 + row[k] * n, y1 + col[k] * n);
            }
        }
        if(f[u][v]) return cout<<f[u][v] - 1, 0;
    }
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:54:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         freopen("Task.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:55:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |         freopen("WA.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...