This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
const int lim=3000;
using pii=pair<int,int>;
vector<vector<int>>grid;
int n,m,l,r,x,y,cnt;
bool vis[lim][lim];
void dfs(int i,int j){
if(vis[i][j])return;
vis[i][j]=1;
cnt++;
l=min(l,i);
r=max(r,i);
x=min(x,j);
y=max(y,j);
if(i&&!grid[i-1][j])dfs(i-1,j);
if(j&&!grid[i][j-1])dfs(i,j-1);
if(i+1<n&&!grid[i+1][j])dfs(i+1,j);
if(j+1<m&&!grid[i][j+1])dfs(i,j+1);
}
const int llim=100;
int mincol[llim][llim][llim],minrow[llim][llim][llim];
long long count_rectangles(std::vector<std::vector<int> > a) {
grid=a;
n=a.size();
m=a[0].size();
bool ok=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]!=1&&a[i][j]!=0){
ok=0;
goto outtt;
}
}
}
outtt:;
if(n<3)return 0;
if(n==3){
vector<int>st;
long int ans=0;
for(int i=0;i<m;i++){
if(1<st.size())
for(int j=int(st.size())-2;0<=j;j--){
if(a[1][st[j+1]]<a[1][i]){
ans++;
}else{
break;
}
}
while(st.size()&&a[1][st.back()]<a[1][i]){
st.pop_back();
}
if(a[0][i]<=a[1][i]||a[2][i]<=a[1][i]){
st.clear();
}
st.push_back(i);
}
return ans;
}else if(ok){
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]==0&&!vis[i][j]){
l=x=INT_MAX;
r=y=0;
cnt=0;
dfs(i,j);
if(l&&x&&r!=n-1&&y!=m-1&&cnt==(r-l+1)*(y-x+1)){
ans++;
}
}
}
}
return ans;
}else{
for(int i=0;i<n;i++){
for(int l=0;l<m;l++){
mincol[i][l][l]=a[i][l];
for(int r=l+1;r<m;r++){
mincol[i][l][r]=max(a[i][r],mincol[i][l][r-1]);
}
}
}
for(int i=0;i<m;i++){
for(int l=0;l<n;l++){
minrow[i][l][l]=a[l][i];
for(int r=l+1;r<n;r++){
mincol[i][l][r]=max(a[r][i],mincol[i][l][r-1]);
}
}
}
int ans=0;
for(int l=0;l<n;l++){
for(int r=l+2;r<n;r++){
for(int x=0;x<m;x++){
for(int y=x+2;y<m;y++){
for(int i=l+1;i<r;i++){
int mindude=minrow[i][x+1][y-1];
if(a[i][x]<mindude||a[i][y]<mindude){
goto nextcase;
}
}
for(int i=x+1;i<y;i++){
int mindude=mincol[i][l+1][r-1];
if(a[l][i]<mindude||a[r][i]<mindude){
goto nextcase;
}
}
ans++;
nextcase:;
}
}
}
}
return ans;
}
return -1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |