제출 #722560

#제출 시각아이디문제언어결과실행 시간메모리
722560PoPularPlusPlusTracks in the Snow (BOI13_tracks)C++17
100 / 100
1858 ms650896 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define pb(e) push_back(e) #define sv(a) sort(a.begin(),a.end()) #define sa(a,n) sort(a,a+n) #define mp(a,b) make_pair(a,b) #define vf first #define vs second #define ar array #define all(x) x.begin(),x.end() const int inf = 0x3f3f3f3f; const int mod = 1000000007; const double PI=3.14159265358979323846264338327950288419716939937510582097494459230; mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count()); bool remender(ll a , ll b){return a%b;} //freopen("problemname.in", "r", stdin); //freopen("problemname.out", "w", stdout); int n , m; int convert(int r , int w){ return r*m+w; } pair<int,int> back(int x){ return mp(x/m,x%m); } struct ufds { vector<int> siz,p; void init(int nn){ siz.resize(nn + 1); p.resize(nn + 1); for(int i = 0; i <= nn; i++){ siz[i] = 1; p[i] = i; } } int get(int x){ return p[x] = (p[x] == x ? x : get(p[x])); } void unio(int x , int y){ x = get(x); y = get(y); if(x == y)return; if(siz[y] > siz[x])swap(x,y); p[y] = x; siz[x] += siz[y]; } }; int dx[4] = {1,0}, dy[4] = {0,1}; void solve(){ cin >> n; cin >> m; char arr[n][m]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++)cin >> arr[i][j]; } ufds dsu; dsu.init(n*m+1); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(arr[i][j] == '.')continue; for(int k = 0; k < 2; k++){ int ni = i + dx[k] , nj = j + dy[k]; if(ni < n && nj < m && ni >= 0 && nj >= 0 && arr[i][j] == arr[ni][nj]){ dsu.unio(convert(i,j),convert(ni,nj)); } } } } vector<int> adj[n*m]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(arr[i][j] == '.')continue; for(int k = 0; k < 2; k++){ int ni = i + dx[k] , nj = j + dy[k]; if(ni < n && ni >= 0 && nj < m && nj >= 0 && arr[ni][nj]!='.'){ int a = convert(ni,nj); int b = convert(i,j); a = dsu.get(a); b = dsu.get(b); if(a==b)continue; adj[a].pb(b); adj[b].pb(a); } } } } int dis[n*m]; queue<int> q; memset(dis,-1,sizeof dis); dis[dsu.get(0)] = 1; q.push(dsu.get(0)); int ans = 1; while(q.size()){ int node = q.front(); q.pop(); for(int i : adj[node]){ int par = dsu.get(i); if(dis[par] == -1){ dis[par] = dis[node] + 1; ans = dis[par]; q.push(par); } } } cout << ans << '\n'; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); // int t;cin>>t; // while(t--){ solve(); //} return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...