Submission #1163133

#TimeUsernameProblemLanguageResultExecution timeMemory
1163133adhityamvMaze (JOI23_ho_t3)C++20
0 / 100
2094 ms43256 KiB
#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <chrono> #include <climits> #include <cmath> #include <complex> #include <cstring> #include <functional> #include <iomanip> #include <iostream> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <vector> #include <stack> using namespace std; #define int long long #define mp make_pair #define fi first #define pii pair<int,int> #define se second const int INF=1000000000000000000; //const int INF=1e9; const int N=1000000; const int M=7+1e9; const int ln=20; struct Mint{ int n; Mint(int nn){ n=nn%M; } Mint(){ n=0; } Mint& operator+=(Mint const& m){ n=(n+m.n)%M; return *this; } Mint& operator*=(Mint const& m){ n=(n*m.n)%M; return *this; } Mint& operator-=(Mint const& m){ n=(n+M-m.n)%M; return *this; } friend Mint binpow(Mint a,int b){ if(b==0) return Mint(1); Mint r=binpow(a,b/2LL); r*=r; if(b%2==0) return r; r*=a; return r; } friend Mint inverse(Mint a){ return binpow(a,M-2); } Mint& operator/=(Mint const &b){ return (*this)*=inverse(b); } friend Mint operator+(Mint a,Mint const b){ return (a+=b); } friend Mint operator-(Mint a,Mint const b){ return (a-=b); } friend Mint operator*(Mint a,Mint const b){ return (a*=b); } friend Mint operator/(Mint a,Mint const b){ return (a/=b); } friend Mint operator-(Mint a){ return 0-a; } friend std::ostream& operator<<(std::ostream& os, Mint const& a){ return os << a.n; } friend std::istream& operator>>(std::istream& is, Mint& a){ return (is >> a.n); } friend bool operator==(Mint const& a,Mint const& b){ return a.n==b.n; } friend bool operator!=(Mint const& a,Mint const& b){ return a.n!=b.n; } }; template<typename T> std::ostream& operator<< (std::ostream& os,pair<T,T> p){ return os << p.fi << "," << p.se << " "; } void solve(){ int r,c,n; cin >> r >> c >> n; pair<int,int> s; cin >> s.fi >> s.se; pair<int,int> g; cin >> g.fi >> g.se; s.fi--,s.se--,g.fi--,g.se--; bool a[r][c]; for(int i=0;i<r;i++){ string s; cin >> s; for(int j=0;j<c;j++){ if(s[j]=='.') a[i][j]=true; else a[i][j]=false; } } // there are two qs : 0 queue and 1 queue // once 0 queue is empty, all members of 1 queue are white, some of them are in 0 queue // continue till 1 queue and 0 queue empty int ans[r][c]; ans[s.fi][s.se]=0; deque<pii> zero; deque<pii> one; int val=0; bool zvisit[r][c]; bool ovisit[r][c]; bool alrzer[r][c]; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ zvisit[i][j]=false; ovisit[i][j]=false; ans[i][j]=INF; alrzer[i][j]=false; } } zvisit[s.fi][s.se]=true; ovisit[s.fi][s.se]=true; for(int i=s.fi-n;i<=s.fi+n;i++){ for(int j=s.se-n;j<=s.se+n;j++){ if(0<=i && i<r && 0<=j && j<c){ if(i==s.fi+n|| i==s.fi-n) if(j==s.se+n || j==s.se-n) continue; ans[i][j]=val+1; ovisit[i][j]=true; one.push_back(mp(i,j)); } } } ans[s.fi][s.se]=0; if(s.fi!=0){ if(a[s.fi-1][s.se]){ zero.push_back(mp(s.fi-1,s.se)); ans[s.fi-1][s.se]=val; alrzer[s.fi-1][s.se]=true; } } if(s.fi!=r-1){ if(a[s.fi+1][s.se]){ zero.push_back(mp(s.fi+1,s.se)); ans[s.fi+1][s.se]=val; alrzer[s.fi+1][s.se]=true; } } if(s.se!=0){ if(a[s.fi][s.se-1]){ zero.push_back(mp(s.fi,s.se-1)); ans[s.fi][s.se-1]=val; alrzer[s.fi][s.se-1]=true; } } if(s.se!=c-1){ if(a[s.fi][s.se+1]){ zero.push_back(mp(s.fi,s.se+1)); ans[s.fi][s.se+1]=val; alrzer[s.fi][s.se+1]=true; } } if(zero.empty()){ val++; while(!one.empty()){ auto p=one.front(); a[p.fi][p.se]=true; if(abs(p.fi-s.fi)+abs(p.se-s.se)==1){ zero.push_back(p); alrzer[p.fi][p.se]=true; } one.pop_front(); } } assert(!zero.empty()); while(!zero.empty()){ while(!zero.empty()){ auto u=zero.front(); zvisit[u.fi][u.se]=true; zero.pop_front(); pii p=mp(-1,-1); if(u.fi!=0){ auto np=mp(u.fi-1,u.se); if(zvisit[np.fi][np.se]) p=np; else if(a[np.fi][np.se] && !alrzer[np.fi][np.se]){ zero.push_back(mp(np.fi,np.se)); alrzer[np.fi][np.se]=true; ans[np.fi][np.se]=val; } } if(u.fi!=r-1){ auto np=mp(u.fi+1,u.se); if(zvisit[np.fi][np.se]) p=np; else if(a[np.fi][np.se] && !alrzer[np.fi][np.se]){ zero.push_back(mp(np.fi,np.se)); alrzer[np.fi][np.se]=true; ans[np.fi][np.se]=val; } } if(u.se!=0){ auto np=mp(u.fi,u.se-1); if(zvisit[np.fi][np.se]) p=np; else if(a[np.fi][np.se] && !alrzer[np.fi][np.se]){ zero.push_back(mp(np.fi,np.se)); alrzer[np.fi][np.se]=true; ans[np.fi][np.se]=val; } } if(u.se!=c-1){ auto np=mp(u.fi,u.se+1); if(zvisit[np.fi][np.se]) p=np; else if(a[np.fi][np.se] && !alrzer[np.fi][np.se]){ zero.push_back(mp(np.fi,np.se)); alrzer[np.fi][np.se]=true; ans[np.fi][np.se]=val; } } assert(abs(p.fi-u.fi)+abs(p.se-u.se)==1); int li,ri,lj,rj; int exi,exj; if(u.fi==p.fi+1){ li=ri=u.fi+n; exi=u.fi+n-1; exj=-1; lj=u.se-n; rj=u.se+n; } if(u.fi==p.fi-1){ li=ri=u.fi-n; exi=u.fi-n+1; exj=-1; lj=u.se-n; rj=u.se+n; } if(u.se==p.se+1){ lj=rj=u.se+n; exj=u.se+n-1; exi=-1; li=u.fi-n; ri=u.fi+n; } if(u.se==p.se-1){ lj=rj=u.se-n; exj=u.se-n+1; exi=-1; li=u.fi-n; ri=u.fi+n; } for(int i=li;i<=ri;i++){ for(int j=lj;j<=rj;j++){ if(0>i || i>=r || 0>j || j>=c) continue; if(i==ri || i==li) if(j==rj || j==lj) continue; if(!ovisit[i][j] && !zvisit[i][j]){ ans[i][j]=min(ans[i][j],val+1); ovisit[i][j]=true; one.push_back(mp(i,j)); } } } if(exj==-1){ int i=exi; for(int j:{lj,rj}){ if(0>i || i>=r || 0>j || j>=c) continue; if(i==ri || i==li) if(j==rj || j==lj) continue; if(!ovisit[i][j] && !zvisit[i][j]){ ans[i][j]=val+1; ovisit[i][j]=true; one.push_back(mp(i,j)); } } } if(exi==-1){ int j=exj; for(int i:{li,ri}){ if(0>i || i>=r || 0>j || j>=c) continue; if(i==ri || i==li) if(j==rj || j==lj) continue; if(!ovisit[i][j] && !zvisit[i][j]){ ans[i][j]=val+1; ovisit[i][j]=true; one.push_back(mp(i,j)); } } } } while(!one.empty()){ auto p=one.front(); a[p.fi][p.se]=true; bool ad=false; if(p.fi!=0 && !ad){ auto np=mp(p.fi-1,p.se); if(zvisit[np.fi][np.se]){ ad=true; } } if(p.fi!=r-1 && !ad){ auto np=mp(p.fi+1,p.se); if(zvisit[np.fi][np.se]){ ad=true; } } if(p.se!=0 && !ad){ auto np=mp(p.fi,p.se-1); if(zvisit[np.fi][np.se]){ ad=true; } } if(p.se!=c-1 && !ad){ auto np=mp(p.fi,p.se+1); if(zvisit[np.fi][np.se]){ ad=true; } } if(ad){ zero.push_back(p); alrzer[p.fi][p.se]=true; } one.pop_front(); } /*for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(ans[i][j]<=val && ans[i][j]!=-1){ if(mp(i,j)==s) cout << '?'; else cout << '.'; } else cout << '#'; } cout << "\n"; } cout << "\n"; cout << val << "\n";*/ val++; } cout << ans[g.fi][g.se] << "\n"; } signed main(){ auto begin = std::chrono::high_resolution_clock::now(); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t; //cin >> t; t=1; while(t--) solve(); auto end = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n"; }
#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...