Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <climits>
- #include <cassert>
- #include <vector>
- #include <set>
- using namespace std;
- typedef unsigned int index;
- char c[2001][2001];
- int comp[2001][2001];
- bool u[2001][2001];
- int last[2001];
- char ans[2001][2001];
- int up[2001][2001];
- int dt[2001][2001];
- int dist[(int) 4e6 + 7];
- vector <pair <int, int> > cells[(int) 4e6 + 7];
- //vector <pair <int, int> > g[(int) 4e6 + 7];
- int dx[] = {0, 0, -1, 1};
- int dy[] = {-1, 1, 0, 0};
- int n, m;
- void dfs(int x, int y, int sz)
- {
- cells[sz].push_back({x, y});
- comp[x][y] = sz;
- u[x][y] = true;
- for (int t = 0; t < 4; t++)
- {
- if (x + dx[t] >= 0 && x + dx[t] < n && y + dy[t] >= 0 && y + dy[t] < m && !u[x + dx[t]][y + dy[t]] && c[x + dx[t]][y + dy[t]] == '#')
- {
- dfs(x + dx[t], y + dy[t], sz);
- }
- }
- }
- int main()
- {
- #ifdef ONPC
- assert(freopen("a.in", "r", stdin));
- assert(freopen("a.out", "w", stdout));
- #endif
- scanf("%d%d", &n, &m);
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- scanf(" %c", &c[i][j]);
- ans[i][j] = '.';
- }
- }
- int sz = 0;
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (c[i][j] == '#' && !u[i][j])
- {
- dfs(i, j, sz++);
- }
- }
- }
- for (int j = 0; j < m; j++) last[j] = -1;
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (c[i][j] == '#')
- {
- up[i][j] = -1;
- if (last[j] != -1 && comp[last[j]][j] != comp[i][j])
- {
- up[i][j] = comp[last[j]][j];
- dt[i][j] = i - last[j] - 1;
- }
- last[j] = i;
- }
- }
- }
- for (int i = 0; i < sz; i++) dist[i] = 1e9;
- set <pair <int, int> > s;
- for (int j = 0; j < m; j++)
- {
- if (last[j] != -1 && dist[comp[last[j]][j]] > n - last[j] - 1)
- {
- s.insert({n - last[j] - 1, comp[last[j]][j]});
- dist[comp[last[j]][j]] = n - last[j] - 1;
- }
- }
- while (!s.empty())
- {
- int v = s.begin()->second;
- for (auto go : cells[v])
- {
- int x = go.first, y = go.second;
- ans[x + dist[v]][y] = '#';
- if (up[x][y] != -1)
- {
- if (dist[up[x][y]] > dist[v] + dt[x][y])
- {
- s.erase({dist[up[x][y]], up[x][y]});
- dist[up[x][y]] = dist[v] + dt[x][y];
- s.insert({dist[up[x][y]], up[x][y]});
- }
- }
- }
- s.erase(s.begin());
- /*
- for (auto x : g[v])
- {
- int to = x.first;
- if (dist[to] > dist[v] + x.second)
- {
- s.erase({dist[to], to});
- dist[to] = dist[v] + x.second;
- s.insert({dist[to], to});
- }
- }
- */
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- printf("%c", ans[i][j]);
- }
- puts("");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement