Submission #737138

#TimeUsernameProblemLanguageResultExecution timeMemory
737138NeroZeinRectangles (IOI19_rect)C++17
0 / 100
1 ms596 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std; 

const int N = 2503;
const int M = N * N;

const int di[] = {0, 0, 1, -1}; 
const int dj[] = {1, -1, 0, 0};

int n, m;
int p[M], sz[M]; 
int x[M], xx[M], y[M], yy[M];
int pref[N][N]; 

int get (int i, int j) {
	return i * m + j; 
}

int getSum (int i, int ii, int j, int jj) {
	return pref[ii][jj] - pref[i - 1][jj] - pref[ii][j - 1] + pref[i - 1][j - 1];
}

int get (int v) {
	return p[v] = (p[v] == v ? v : get(p[v]));
}

inline void unite (int u, int v) {
	u = get(u); v = get(v);
	if (u == v) return; 
	if (sz[u] < sz[v]) swap(u, v); 
	sz[v] += sz[u]; 
	p[u] = v; 
	x[v] = min(x[v], x[u]); 
	xx[v] = max(xx[v], xx[u]); 
	y[v] = min(y[v], y[u]);
	yy[v] = max(yy[v], yy[u]); 
}

long long count_rectangles(std::vector<std::vector<int> > a) {
	n = (int) a.size(); 
	m = (int) a[0].size(); 
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			int num = get(i, j); 
			p[num] = num;
			sz[num] = 1; 
			x[num] = xx[num] = i;
			y[num] = yy[num] = j;  
			pref[i][j] = pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1]; 
		}
	}
	for (int i = 1; i < n - 1; ++i) {
		for (int j = 1; j < m - 1; ++j) {
			if (a[i][j] == 0) {
				for (int k = 0; k < 4; ++k) {
					int ni = i + di[k], nj = j + dj[k];
					if (a[ni][nj] == 0) {
						unite(get(i, j), get(ni, nj)); 						
					}
				}
			}
		}
	}
	int ans = 0; 
	for (int i = 1; i < n - 1; ++i) {
		for (int j = 1; j < m - 1; ++j) {
			int num = get(i, j); 
			if (get(num) == num) {
				if (x[num] > 0 && xx[num] < n - 1 && y[num] > 0 && yy[num] < m - 1) {
					ans += getSum(x[num], xx[num], y[num], yy[num]) == 0; 					
				}
			}
		}
	}
	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...