Submission #286374

#TimeUsernameProblemLanguageResultExecution timeMemory
286374Alexa2001Sandwich (JOI16_sandwich)C++17
100 / 100
7183 ms12500 KiB
#include <bits/stdc++.h> using namespace std; const int inf = 1e9; const int Nmax = 404; int cells, n, m; bool bad; char a[Nmax][Nmax]; int ans[Nmax][Nmax]; int Upper[Nmax][Nmax], Lower[Nmax][Nmax]; void add_upper(int x, int y); void add_lower(int x, int y) { if(Lower[x][y] == 1) bad = 1; if(Lower[x][y]) return; Lower[x][y] = 1; ++cells; if(a[x][y] == 'N') /// adaug dreapta { if(a[x][y+1] == 'N') add_lower(x, y+1); else if(a[x][y+1] == 'Z') add_upper(x, y+1); if(x - 1 >= 1) add_lower(x-1, y); } else { if(a[x][y-1] == 'N') add_upper(x, y-1); else if(a[x][y-1] == 'Z') add_lower(x, y-1); if(x - 1 >= 1) add_lower(x-1, y); } Lower[x][y] = -1; } void add_upper(int x, int y) { if(Upper[x][y] == 1) bad = 1; if(Upper[x][y]) return; Upper[x][y] = 1; ++cells; if(a[x][y] == 'N') /// adaug dreapta { if(a[x][y-1] == 'N') add_upper(x, y-1); else if(a[x][y-1] == 'Z') add_lower(x, y-1); if(x + 1 <= n) add_upper(x+1, y); } else { if(a[x][y+1] == 'N') add_lower(x, y+1); else if(a[x][y+1] == 'Z') add_upper(x, y+1); if(x + 1 <= n) add_upper(x+1, y); } Upper[x][y] = -1; } void solve1(int c) { int i, j; for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) Lower[i][j] = Upper[i][j] = 0; cells = 0; bad = 0; for(i=1; i<=n; ++i) { add_lower(i, c); if(bad) return; ans[i][c] = min(ans[i][c], cells); } } void solve2(int c) { int i, j; for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) Lower[i][j] = Upper[i][j] = 0; cells = 0; bad = 0; for(i=n; i; --i) { add_upper(i, c); if(bad) return; ans[i][c] = min(ans[i][c], cells); } } int main() { // freopen("input", "r", stdin); cin.tie(0); cin.sync_with_stdio(false); cin >> n >> m; int i, j; for(i=1; i<=n; ++i) cin >> (a[i] + 1); for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) ans[i][j] = inf; for(i=1; i<=m; ++i) solve1(i); for(i=1; i<=m; ++i) solve2(i); for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) cout << (ans[i][j] == inf ? -1 : 2 * ans[i][j]) << " \n"[j==m]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...