제출 #1237193

#제출 시각아이디문제언어결과실행 시간메모리
1237193Sir_Ahmed_ImranRectangles (IOI19_rect)C++17
13 / 100
188 ms147508 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 2503
#define nl '\n'
#define ff first
#define ss second
#define ll long long
#define ld long double
#define terminator main
#define pll pair<ll,ll>
#define add insert
#define append push_back
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()

int a[MAXN][MAXN];
int p[MAXN][MAXN];
int r[MAXN][MAXN];
int c[MAXN][MAXN];

int get(int i, int j, int I, int J){
	return p[I][J] - p[i - 1][J] - p[I][j - 1] + p[i - 1][j - 1]; 
}

bool check(int i, int j, int I, int J){
	int ans = get(i - 1, j - 1, I + 1, J + 1);
	ans -= a[I + 1][J + 1] + a[i - 1][J + 1] + a[I + 1][j - 1] + a[i - 1][j - 1];
	return (ans == (2 * (I + J - i - j + 2)));
}

ll count_rectangles(vector<vector<int>> rec){
	int n, m, I, J;
	ll ans = 0;
	n = rec.size();
	m = rec[0].size();
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			a[i][j] = rec[i - 1][j - 1];
			p[i][j] = a[i][j] + p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1];
		}
	}
	for(int i = n; i > 0; i--){
		for(int j = m; j > 0; j--){
			if(a[i][j] == 0){
				r[i][j] = max(i, r[i + 1][j]);
				c[i][j] = max(j, c[i][j + 1]);
			}
		}
	}
	for(int i = 2; i < n; i++){
		for(int j = 2; j < m; j++){
			if(a[i][j] > 0) continue;
			I = r[i][j], J = c[i][j];
			if(I < n && J < m && get(i, j, I, J) == 0 && check(i, j, I, J))
				ans++;
		}
	}
	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...