제출 #1210547

#제출 시각아이디문제언어결과실행 시간메모리
1210547banganRectangles (IOI19_rect)C++20
0 / 100
21 ms49480 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 2500 + 4;

int pre[N][N];
int r[N][N];
int d[N][N];

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

long long count_rectangles(std::vector<std::vector<int>> a) {
	memset(r, -1, sizeof r);
	memset(d, -1, sizeof d);
	int n = a.size();
	int m = a[0].size();
	for (int i=0; i<n; i++) for (int j=0; j<m; j++) pre[i+1][j+1] = a[i][j] + pre[i+1][j] + pre[i][j+1] - pre[i][j];
	for (int i=1; i+1<n; i++) for (int j=m-2; j>=1; j--) if (!a[i][j]) {
		if (j==m-2 || a[i][j+1]==1) r[i][j]=j;
		else r[i][j] = r[i][j+1];
	}
	for (int j=1; j+1<m; j++) for (int i=n-2; i>=1; i--) if (!a[i][j]) {
		if (i==n-2 || a[i+1][j]==1) d[i][j]=i;
		else d[i][j] = d[i+1][j];
	}
	int ans=0;
	for (int i=1; i+1<n; i++) for (int j=1; j+1<m; j++) if (!a[i][j]) {
		int ii=r[i][j];
		int jj=d[i][j];
		ans += get(i,j,ii,jj)==0 && get(i-1,j,i-1,jj)==jj-j+1 && get(ii+1,j,ii+1,jj)==jj-j+1 && get(i,j-1,ii,j-1)==ii-i+1 && get(i,jj+1,ii,jj+1)==ii-i+1;
	} 
	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...