이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 2501;
int m,n;
int s[N][N],r[N][N],u[N][N],d[N][N],l[N][N],mly[N];
long long ans;
void run(int x,int y)
{
r[x][y] = y;
for(int i = 1;;i++)
{
if(y+i>n) break;
if(s[x][y+i]>=s[x][y]) break;
r[x][y] = y+i;
}
l[x][y] = y;
for(int i = 1;;i++)
{
if(y-i<1) break;
if(s[x][y-i]>=s[x][y]) break;
l[x][y] = y-i;
}
d[x][y] = x;
for(int i = 1;;i++)
{
if(x+i>m) break;
if(s[x+i][y]>=s[x][y]) break;
d[x][y] = x+i;
}
u[x][y] = x;
for(int i = 1;;i++)
{
if(x-i<1) break;
if(s[x-i][y]>=s[x][y]) break;
u[x][y] = x-i;
}
}
long long count_rectangles(vector<vector<int> > _a)
{
m = _a.size(),n = _a[0].size();
for(int i = 0;i < m;i++) for(int j = 0;j < n;j++) s[i+1][j+1] = _a[i][j];
for(int i = 1;i <= m;i++) for(int j = 1;j <= n;j++) run(i,j);
for(int i = 1;i <= m;i++) for(int j = i+2;j <= m;j++)
{
for(int x = 2;x <= n;x++)
{
int mn = INT_MAX;
for(int k = i+1;k < j;k++) mn = min(mn,r[k][x-1]);
for(int y = x;y <= min(mn,n-1);y++)
{
// cout << i << ' ' << j << ' ' << x << ' ' << y << ' ' << d[i][y] << ' ' << u[j][y] << endl;
if(d[i][y]<j-1 or u[j][y]>i+1) break;
int mx = INT_MIN;
for(int k = i+1;k < j;k++) mx = max(mx,l[k][y+1]);
// cout << i << ' ' << j << ' ' << x << ' ' << y << ' ' << mx << endl;
// if(mx<=x) cout << i << ' ' << j << ' ' << x << ' ' << y << endl,ans++;
if(mx<=x) ans++;
}
}
}
return ans;
}
# | 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... |