Submission #610767

#TimeUsernameProblemLanguageResultExecution timeMemory
610767lorenzoferrariRectangles (IOI19_rect)C++17
13 / 100
344 ms62540 KiB
#include "rect.h" #include <bits/stdc++.h> using namespace std; using LL = long long; #define UP 0 #define LEFT 1 #define DOWN 2 #define RIGHT 3 constexpr int INF = 1e9; const vector<array<int, 2>> dd{{0,1},{0,-1},{1,0},{-1,0}}; int n, m; struct comp { int sz; array<int, 4> ext; comp() : sz(0), ext({INF, INF, -INF, -INF}) {} comp(int i, int j) : sz(1), ext({i,j,i,j}) {} bool good() { if (ext[UP] == 0 || ext[DOWN] == n-1) return false; if (ext[LEFT] == 0 || ext[RIGHT] == m-1) return false; return sz == (ext[DOWN] - ext[UP] + 1) * (ext[RIGHT] - ext[LEFT] + 1); } }; comp join(const comp& a, const comp& b) { comp ans; ans.sz = a.sz + b.sz; ans.ext[UP] = min(a.ext[UP], b.ext[UP]); ans.ext[LEFT] = min(a.ext[LEFT], b.ext[LEFT]); ans.ext[DOWN] = max(a.ext[DOWN], b.ext[DOWN]); ans.ext[RIGHT] = max(a.ext[RIGHT], b.ext[RIGHT]); return ans; } LL count_rectangles(vector<vector<int>> a) { n = a.size(); m = a[0].size(); // subtask a[i][j] \in {0,1} LL ans = 0; vector<vector<bool>> vis(n, vector<bool>(m, false)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { if (vis[i][j] || a[i][j] == 1) continue; comp cur(i, j); queue<array<int, 2>> Q; Q.push({i, j}); vis[i][j] = true; while (!Q.empty()) { auto [x, y] = Q.front(); Q.pop(); for (auto [dx, dy] : dd) { int nx = x + dx; int ny = y + dy; if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; if (vis[nx][ny] || a[nx][ny] == 1) continue; vis[nx][ny] = true; Q.push({nx, ny}); cur = join(cur, comp(nx, ny)); } } ans += cur.good(); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...