Submission #1284892

#TimeUsernameProblemLanguageResultExecution timeMemory
1284892syanvuMaze (JOI23_ho_t3)C++20
100 / 100
1607 ms110352 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> #define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); // #pragma optimize("g", on) // #pragma GCC optimize("03") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native") // #define int long long #define all(x) x.begin(),x.end() #define F first #define S second using namespace std; // using namespace __gnu_pbds; // #define ordered_set tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> const int LG = 17,N = 2e5+1,inf = 1e9,MOD = 1e9 + 7; const double eps = 1e-9; int T; void solve() { int r,c,n; cin>>r>>c>>n; string s[r]; int sx,sy,fx,fy; cin>>sx>>sy>>fx>>fy; sx--,sy--,fx--,fy--; for(int i=0;i<r;i++) cin>>s[i]; priority_queue<array<int,4>,vector<array<int,4>>,greater<array<int,4>>> pq; int used[r][c]={}; pair<int,int> dp[r][c]; for(int i=0;i<r;i++){ for(int j=0;j<c;j++) dp[i][j] = {inf,0}; } dp[sx][sy]={0,0}; pq.push({0,0,sx,sy}); int dx[8]={0,0,1,-1,1,-1,1,-1},dy[8]={1,-1,0,0,1,1,-1,-1}; while(pq.size()){ auto [musor,govno,x,y] = pq.top(); pq.pop(); used[x][y]=1; for(int i=0;i<8;i++){ int tox=dx[i] + x, toy=dy[i] + y; if(min(tox,toy)<0 || tox>=r || toy>=c) continue; if(dp[x][y].S == 0){ if(i>=4) continue; if(s[tox][toy] == '.'){ if(dp[tox][toy].F > dp[x][y].F){ dp[tox][toy] = {dp[x][y].F, 0}; if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy}); used[tox][toy]=1; } } else{ if(dp[tox][toy].F >= dp[x][y].F + 1){ dp[tox][toy] = {dp[x][y].F + 1, n-1}; if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy}); used[tox][toy]=1; } } } else if(dp[x][y].S > 0){ if(dp[tox][toy].F > dp[x][y].F){ dp[tox][toy] = {dp[x][y].F, dp[x][y].S-1}; if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy}); used[tox][toy]=1; } else if(dp[tox][toy].F == dp[x][y].F && dp[tox][toy].S < dp[x][y].S - 1){ dp[tox][toy] = {dp[x][y].F, dp[x][y].S-1}; if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy}); used[tox][toy]=1; } } } } cout<<dp[fx][fy].F; } signed main() { SS int t = 1; if (T) { cin >> t; } while (t--) { solve(); } }
#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...