제출 #1135513

#제출 시각아이디문제언어결과실행 시간메모리
1135513UnforgettableplMaze (JOI23_ho_t3)C++20
86 / 100
2097 ms294836 KiB
#pragma GCC optimize("Ofast","unroll-loops")
#include <bits/stdc++.h>
using namespace std;

// #define int long long


int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int r,c,n;
    cin >> r >> c >> n;
    pair<int,int> sP,eP;
    cin >> sP.first >> sP.second;
    cin >> eP.first >> eP.second;
    vector visited(r+2,vector(c+2,0));
    vector grid(r+2,vector(c+2,false));
    for(int i=0;i<=r+1;i++)visited[i][0]=visited[i][c+1]=true;
    for(int i=0;i<=c+1;i++)visited[0][i]=visited[r+1][i]=true;
    vector<set<int>> rows(r+1);
    vector<set<int>> cols(c+1);
    for(int i=1;i<=r;i++) {
        for(int j=1;j<=c;j++) {
            char a;cin>>a;
            rows[i].insert(j);
            cols[j].insert(i);
            if(a=='#') grid[i][j]=true;
        }
    }
    priority_queue<tuple<int,int,int>> pq;
    pq.emplace(0,sP.first,sP.second);
    while(!pq.empty()) {
        auto [dist,i,j] = pq.top();pq.pop();dist=-dist;
        if(visited[i][j]==2)continue;
        visited[i][j]=2;
        if(rows[i].contains(j))rows[i].erase(j);
        if(cols[j].contains(i))cols[j].erase(i);
        if(make_pair(i,j)==eP) {
            cout << dist << '\n';
            return 0;
        }
        // Case 1
        auto helper = [&](int i,int j) {
            if(visited[i][j] or grid[i][j])return;
            pq.emplace(-dist,i,j);
            visited[i][j]=1;
            if(rows[i].contains(j))rows[i].erase(j);
            if(cols[j].contains(i))cols[j].erase(i);
        };
        helper(i,j+1);
        helper(i,j-1);
        helper(i+1,j);
        helper(i-1,j);
        // Case 2
        int absX = abs(i-eP.first);
        int absY = abs(j-eP.second);
        if(min(absX,absY)<n and max(absX,absY)<=n)pq.emplace(-dist-1,eP.first,eP.second);
        // Case 3
        // left line
        if(j-n>=1)while(true) {
            auto iter = cols[j-n].upper_bound(i-n);
            if(iter==cols[j-n].end() or *iter>=i+n)break;
            pq.emplace(-dist-1,*iter,j-n);
            cols[j-n].erase(iter);
        }
        // right line
        if(j+n<=c)while(true) {
            auto iter = cols[j+n].upper_bound(i-n);
            if(iter==cols[j+n].end() or *iter>=i+n)break;
            pq.emplace(-dist-1,*iter,j+n);
            cols[j+n].erase(iter);
        }
        // up line
        if(i-n>=1)while(true) {
            auto iter = rows[i-n].upper_bound(j-n);
            if(iter==rows[i-n].end() or *iter>=j+n)break;
            pq.emplace(-dist-1,i-n,*iter);
            rows[i-n].erase(iter);
        }
        // down line
        if(i+n<=r)while(true) {
            auto iter = rows[i+n].upper_bound(j-n);
            if(iter==rows[i+n].end() or *iter>=j+n)break;
            pq.emplace(-dist-1,i+n,*iter);
            rows[i+n].erase(iter);
        }
    }
    assert(false);
}
#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...