Submission #22811

#TimeUsernameProblemLanguageResultExecution timeMemory
22811past future present (#40)Young Zebra (KRIII5_YZ)C++14
2 / 7
93 ms13048 KiB
#include<stdio.h> #include<vector> #include<queue> #include<algorithm> using namespace std; char in[405]; bool fl[400][400], v1[400*400], v2[400*400]; int dx[4] = { -1,0,0,1 }, dy[4] = { 0,1,-1,0 }, n, m; vector<int> g[400 * 400], cc; int ans[400*400], v[400][400], nf, len[400*400]; inline int pti(int y, int x) { return y*m + x; } void foo(int i, int j) { if (v[i][j] != 0) return; nf++; v[i][j] = nf; queue<int> q; q.emplace(pti(i, j)); while (!q.empty()) { int idx = q.front(); int y = idx / m; int x = idx % m; q.pop(); ans[nf]++; for (int e : g[idx]) { int yy = e / m, xx = e%m; if (v[yy][xx]) continue; v[yy][xx] = nf; q.emplace(e); } } return; } bool bar(int c, int p) { v1[c] = v2[c] = true; cc.push_back(c); bool cycle = false; for (int e : g[c]) { if (e == p) continue; if (v1[e]) { int l = len[c] + 1 - len[e]; if (l & 1) cycle = true; } else { len[e] = len[c] + 1; cycle |= bar(e, c); } } if (cycle) ans[c] = -1; v1[c] = false; return cycle; } int main() { scanf("%d%d", &n, &m); for(int i=0;i<n;i++) { scanf("%s", in); for (int j = 0; j < m; j++) fl[i][j] = in[j] == 'B'; } for(int i=0;i<n;i++) for (int j = 0; j < m; j++) { int p1 = pti(i, j); for (int d = 0; d < 4; d++) { int x = j + dx[d], y = i + dy[d]; if (x < 0 || x >= m || y < 0 || y >= n) continue; if (fl[i][j] != fl[y][x]) continue; int p2 = pti(y, x); g[p1].push_back(p2); } } for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) foo(i, j); for (int i = 0; i <= nf; i++) g[i].clear(); for (int i = 0; i < n; i++) { if (fl[i][0] != fl[i][m - 1]) continue; g[v[i][0]].push_back(v[i][m - 1]); g[v[i][m - 1]].push_back(v[i][0]); } for (int i = 0; i < m; i++) { if (fl[0][i] != fl[n - 1][i]) continue; g[v[0][i]].push_back(v[n - 1][i]); g[v[n - 1][i]].push_back(v[0][i]); } for (int i = 0; i <= nf; i++) { sort(g[i].begin(), g[i].end()); g[i].erase(unique(g[i].begin(), g[i].end()), g[i].end()); } for (int i = 1; i <= nf; i++) { if (v2[i]) continue; v2[i] = true; len[i] = 0; cc.clear(); bar(i,0); int sum = 0; sort(cc.begin(), cc.end()); cc.erase(unique(cc.begin(), cc.end()), cc.end()); for (int i : cc) sum += ans[i]; if (sum < 0) sum = -1; for (int i : cc) ans[i] = sum; } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%d ", ans[v[i][j]]); } puts(""); } }

Compilation message (stderr)

YZ.cpp: In function 'void foo(int, int)':
YZ.cpp:29:7: warning: unused variable 'y' [-Wunused-variable]
   int y = idx / m;
       ^
YZ.cpp:30:7: warning: unused variable 'x' [-Wunused-variable]
   int x = idx % m;
       ^
YZ.cpp: In function 'int main()':
YZ.cpp:70:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
                       ^
YZ.cpp:73:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", in);
                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...