제출 #924167

#제출 시각아이디문제언어결과실행 시간메모리
924167Edu175Maze (JOI23_ho_t3)C++17
86 / 100
2072 ms940152 KiB
#include <bits/stdc++.h> #define pb push_back #define fst first #define snd second #define fore(i,a,b) for(ll i=a,ggdem=b;i<ggdem;++i) #define SZ(x) ((int)x.size()) #define ALL(x) x.begin(),x.end() #define mset(a,v) memset((a),(v),sizeof(a)) #define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define imp(v) for(auto edu:v)cout<<edu<<" "; cout<<"\n" using namespace std; typedef long long ll; typedef pair<ll,ll> ii; const ll MAXN=6e6+5; ll a[MAXN]; ll n,m,k; ll cv(ii x){return m*x.fst+x.snd;} ii cv(ll x){return {x/m,x%m};} vector<ii>dir={{0,1},{-1,0},{0,-1},{1,0}}; ii operator+(ii a, ii b){return {a.fst+b.fst,a.snd+b.snd};} void operator+=(ii &a, ii b){a=a+b;} bool allowed(ii p){ auto [i,j]=p; if(i<0||i>=n||j<0||j>=m)return 0; return 1; } ll d[MAXN],vis[MAXN]; deque<pair<ii,ll>>q; set<ll>r[MAXN],c[MAXN]; vector<ii>pop; void go(ii x, ii y, ll g){ if(vis[cv(y)])return; d[cv(y)]=d[cv(x)]+g; q.push_front({y,0}); vis[cv(y)]=1; pop.pb(y); } void popit(){ for(auto [i,j]:pop)r[i].erase(j),c[j].erase(i); pop.clear(); } ll reach(ii x, ii e){ return (max(abs(x.fst-e.fst),abs(x.snd-e.snd))<=k&& abs(x.fst-e.fst)+abs(x.snd-e.snd)<2*k); } ll bfs(ii s, ii e){ mset(d,-1); d[cv(s)]=0; q.push_front({s,0}); while(SZ(q)){ auto [x,g]=q.front(); q.pop_front(); if(!g){ for(auto add:dir){ auto y=x+add; if(!allowed(y)||(!g&&a[cv(y)]))continue; go(x,y,0); popit(); } q.pb({x,1}); } else { auto [i,j]=x; if(reach(x,e))go(x,e,1); if(i-k>=0) for(auto it=r[i-k].upper_bound(j-k); it!=r[i-k].end()&&*it<j+k;it++)go(x,{i-k,*it},1); if(i+k<n) for(auto it=r[i+k].upper_bound(j-k); it!=r[i+k].end()&&*it<j+k;it++)go(x,{i+k,*it},1); if(j-k>=0) for(auto it=c[j-k].upper_bound(i-k); it!=c[j-k].end()&&*it<i+k;it++)go(x,{*it,j-k},1); if(j+k<m) for(auto it=c[j+k].upper_bound(i-k); it!=c[j+k].end()&&*it<i+k;it++)go(x,{*it,j+k},1); popit(); } } return d[cv(e)]; } int main(){FIN; cin>>n>>m>>k; ii s,e; cin>>s.fst>>s.snd>>e.fst>>e.snd; s.fst--,s.snd--,e.fst--,e.snd--; fore(i,0,n*m){ char c; cin>>c; a[i]=(c=='#'); } fore(i,0,n)fore(j,0,m)r[i].insert(j),c[j].insert(i); cout<<bfs(s,e)<<"\n"; return 0; }
#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...