제출 #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...