Submission #1093067

#TimeUsernameProblemLanguageResultExecution timeMemory
1093067mm77Tracks in the Snow (BOI13_tracks)C++14
0 / 100
1377 ms1048576 KiB
#include<bits/stdc++.h> using namespace std; const int N=4e3+4; pair<int,int>anc[N][N]; char t[N][N]; vector<pair<int,int>>f[N][N]; vector<pair<int,int>>r[N][N]; pair<int,int>fF(int x,int y) { if(anc[x][y].first==x&&anc[x][y].second==y)return {x,y}; return anc[x][y]=fF(anc[x][y].first,anc[x][y].second); } void uF(int x,int y,int a,int b) { if(fF(x,y)==fF(a,b))return; pair<int,int>p=fF(x,y); pair<int,int>p2=fF(a,b); x=p.first,y=p.second; a=p2.first,b=p2.second; if(f[x][y].size()>f[a][b].size()) { swap(x,a); swap(y,b); } anc[x][y]={a,b}; for(auto p:f[x][y]) { f[a][b].push_back(p); } f[x][y].clear(); } void uR(int x,int y,int a,int b) { if(fF(x,y)==fF(a,b))return ; pair<int,int>p=fF(x,y); pair<int,int>p2=fF(a,b); x=p.first,y=p.second; a=p2.first,b=p2.second; if(r[x][y].size()>r[a][b].size()) { swap(x,a); swap(y,b); } anc[x][y]={a,b}; for(auto p:r[x][y]) { r[a][b].push_back(p); } r[x][y].clear(); } int main() { int n,m; cin>>n>>m; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>t[i][j]; anc[i][j]={i,j}; if(t[i][j]=='R')r[i][j].push_back({i,j}); if(t[i][j]=='F')f[i][j].push_back({i,j}); } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(t[i][j]=='R'&&t[i-1][j]=='R')uR(i,j,i-1,j); if(t[i][j]=='R'&&t[i][j-1]=='R')uR(i,j,i,j-1); } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(t[i][j]=='F'&&t[i-1][j]=='F')uF(i,j,i-1,j); if(t[i][j]=='F'&&t[i][j-1]=='F')uF(i,j,i,j-1); } } char akt=t[1][1]; int res=0; while(true) { if(akt=='F'&&f[anc[1][1].first][anc[1][1].second].size()==0)break; if(akt=='R'&&r[anc[1][1].first][anc[1][1].second].size()==0)break; res++; if(akt=='R') { for(auto p:r[anc[1][1].first][anc[1][1].second]) { int i=p.first,j=p.second; if(t[i-1][j]=='F')uF(i,j,i-1,j); if(t[i][j-1]=='F')uF(i,j,i,j-1); if(t[i+1][j]=='F')uF(i,j,i+1,j); if(t[i][j+1]=='F')uF(i,j,i,j+1); } r[anc[1][1].first][anc[1][1].second].clear(); } else { for(auto p:f[anc[1][1].first][anc[1][1].second]) { int i=p.first,j=p.second; if(t[i-1][j]=='R')uR(i,j,i-1,j); if(t[i][j-1]=='R')uR(i,j,i,j-1); if(t[i+1][j]=='R')uR(i,j,i+1,j); if(t[i][j+1]=='R')uR(i,j,i,j+1); } f[anc[1][1].first][anc[1][1].second].clear(); } if(akt=='R')akt='F'; else akt='R'; } cout<<res<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...