#include<bits/stdc++.h>
#define ll long long
#ifndef local
#include "rect.h"
#endif
using namespace std;
int L[2505][2505][2],R[2505][2505][2],n,m;
ll sum[2505][2505];
void clearStack(stack<int>& s) {
while(!s.empty()) s.pop();
}
void precalculate(vector<vector<int> > &a) {
for (int i = 0; i < n; i++) {
stack<int> s;
for (int j = 0; j < m; j++) {
int val = a[i][j];
sum[i][j] = (j ? sum[i][j-1] : 0) + (i ? sum[i-1][j] : 0) - ( i && j ? sum[i-1][j-1]: 0) + a[i][j];
while(!s.empty() && a[i][s.top()] < val)
s.pop();
L[i][j][0] = (s.empty() ? 0 : s.top() + 1);
s.push(j);
}
clearStack(s);
for (int j = m-1; j > -1; j--) {
int val = a[i][j];
while(!s.empty() && a[i][s.top()] < val)
s.pop();
R[i][j][0] = (s.empty() ? m-1 : s.top() - 1);
s.push(j);
}
}
for (int i = 0; i < m; i++) {
stack<int> s;
for (int j = 0; j < n; j++) {
int val = a[j][i];
while(!s.empty() && a[s.top()][i] < val)
s.pop();
L[j][i][1] = (s.empty() ? 0 : s.top() + 1);
s.push(j);
}
clearStack(s);
for (int j = n-1; j > -1; j--) {
int val = a[j][i];
while(!s.empty() && a[s.top()][i] < val)
s.pop();
R[j][i][1] = (s.empty() ? n-1 : s.top() - 1);
s.push(j);
}
}
}
ll CaseSmall(vector<vector<int> > &a) {
ll cnt = 0;
for (int xi = 1; xi < m-1; xi++)
for (int xj = xi; xj < m-1; xj++)
for (int yi = 1; yi < n-1; yi++)
for (int yj = yi; yj < n-1; yj++) {
bool flag = 1;
for (int k = xi; k <= xj && flag;k++) {
if (R[yi-1][k][1] < yj) flag = 0;
if (L[yj+1][k][1] > yi) flag = 0;
}
for (int k = yi; k <= yj && flag;k++) {
if (R[k][xi-1][0] < xj) flag = 0;
if (L[k][xj+1][0] > xi) flag = 0;
}
if (flag) cnt++;
}
return cnt;
}
ll SumRect(int xi,int xj,int yi,int yj) {
return sum[yj][xj] + (yi && xi ? sum[yi-1][xi-1] : 0) -
(yi ? sum[yi-1][xj] : 0) - (xi ? sum[yj][xi-1] : 0);
}
ll CaseZero(vector<vector<int> > &a) {
ll cnt = 0;
for (int i = 0; i < n-1; i++)
for (int j = 0; j < m-1; j++) {
if (a[i][j+1]!= 1 || a[i+1][j] != 1) continue;
int r = R[i+1][j][0];
int d = R[i][j+1][1];
r++;
d++;
if (r <= j+1 || d <= i+1 || r == m || d == n) continue;
int x = SumRect(j,r,i,d);
cnt += (SumRect(j+1,r - 1,i+1,d-1) == 0
&& x == (2*(r - i + d - j)
- (1 - a[i][j]) -(1 - a[i][r]) - (1-a[d][j]) - (1 - a[d][r])));
}
return cnt;
}
ll count_rectangles(vector<vector<int> > a) {
n = a.size();
m = a[0].size();
precalculate(a);
bool flag = 1;
for (int i = 0; i < n;i++)
for (int j = 0; j < m;j++)
if (a[i][j] > 1) flag = 0;
if (flag) return CaseZero(a);
ll cnt = 0;
if (n <= 200 || m <= 200) return CaseSmall(a);
/* for (int i = 0; i < n; i++)
for (int j = 0;j < m; j++) {
cout << i <<' '<<j << ":\t" << "left " << L[i][j][0] <<" right "<< R[i][j][0] <<" up " << L[i][j][1] <<" down " << R[i][j][1] <<'\n';
}*/
return 0;
}
#ifdef local
main() {
cin >> n >> m;
vector<vector<int> > a(n,vector<int>(m));
for (int i = 0;i < n; i++ )
for (int j = 0; j < m; j++)
cin >> a[i][j];
cout << count_rectangles(a);
/*
6 5
4 8 7 5 6
7 4 10 3 5
9 7 20 14 2
9 14 7 3 6
5 7 5 2 7
4 5 13 5 6
*/
/*
4 4
1 1 1 1
1 0 0 1
1 1 1 1
1 1 1 1*/
}
#endif
Compilation message
rect.cpp: In function 'long long int CaseSmall(std::vector<std::vector<int> >&)':
rect.cpp:53:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for (int xi = 1; xi < m-1; xi++)
^~~
rect.cpp:68:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
return cnt;
^~~~~~
rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:101:6: warning: unused variable 'cnt' [-Wunused-variable]
ll cnt = 0;
^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
768 KB |
Output is correct |
3 |
Correct |
5 ms |
768 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Correct |
5 ms |
640 KB |
Output is correct |
6 |
Correct |
5 ms |
768 KB |
Output is correct |
7 |
Correct |
5 ms |
640 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
768 KB |
Output is correct |
10 |
Correct |
6 ms |
640 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
768 KB |
Output is correct |
13 |
Correct |
5 ms |
384 KB |
Output is correct |
14 |
Correct |
5 ms |
512 KB |
Output is correct |
15 |
Correct |
5 ms |
384 KB |
Output is correct |
16 |
Correct |
5 ms |
256 KB |
Output is correct |
17 |
Correct |
5 ms |
384 KB |
Output is correct |
18 |
Correct |
5 ms |
384 KB |
Output is correct |
19 |
Correct |
5 ms |
640 KB |
Output is correct |
20 |
Correct |
5 ms |
640 KB |
Output is correct |
21 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
768 KB |
Output is correct |
3 |
Correct |
5 ms |
768 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Correct |
5 ms |
640 KB |
Output is correct |
6 |
Correct |
5 ms |
768 KB |
Output is correct |
7 |
Correct |
5 ms |
640 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
768 KB |
Output is correct |
10 |
Correct |
6 ms |
640 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
768 KB |
Output is correct |
13 |
Correct |
5 ms |
384 KB |
Output is correct |
14 |
Correct |
5 ms |
512 KB |
Output is correct |
15 |
Correct |
5 ms |
384 KB |
Output is correct |
16 |
Correct |
5 ms |
256 KB |
Output is correct |
17 |
Correct |
40 ms |
1536 KB |
Output is correct |
18 |
Correct |
28 ms |
1536 KB |
Output is correct |
19 |
Correct |
28 ms |
1536 KB |
Output is correct |
20 |
Correct |
20 ms |
1664 KB |
Output is correct |
21 |
Correct |
23 ms |
1536 KB |
Output is correct |
22 |
Correct |
32 ms |
1536 KB |
Output is correct |
23 |
Correct |
24 ms |
1536 KB |
Output is correct |
24 |
Correct |
11 ms |
1408 KB |
Output is correct |
25 |
Correct |
5 ms |
384 KB |
Output is correct |
26 |
Correct |
5 ms |
384 KB |
Output is correct |
27 |
Correct |
5 ms |
640 KB |
Output is correct |
28 |
Correct |
5 ms |
640 KB |
Output is correct |
29 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
768 KB |
Output is correct |
3 |
Correct |
5 ms |
768 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Correct |
5 ms |
640 KB |
Output is correct |
6 |
Correct |
5 ms |
768 KB |
Output is correct |
7 |
Correct |
5 ms |
640 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
768 KB |
Output is correct |
10 |
Correct |
6 ms |
640 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
768 KB |
Output is correct |
13 |
Correct |
5 ms |
384 KB |
Output is correct |
14 |
Correct |
5 ms |
512 KB |
Output is correct |
15 |
Correct |
5 ms |
384 KB |
Output is correct |
16 |
Correct |
5 ms |
256 KB |
Output is correct |
17 |
Correct |
40 ms |
1536 KB |
Output is correct |
18 |
Correct |
28 ms |
1536 KB |
Output is correct |
19 |
Correct |
28 ms |
1536 KB |
Output is correct |
20 |
Correct |
20 ms |
1664 KB |
Output is correct |
21 |
Correct |
23 ms |
1536 KB |
Output is correct |
22 |
Correct |
32 ms |
1536 KB |
Output is correct |
23 |
Correct |
24 ms |
1536 KB |
Output is correct |
24 |
Correct |
11 ms |
1408 KB |
Output is correct |
25 |
Correct |
853 ms |
4088 KB |
Output is correct |
26 |
Correct |
873 ms |
4088 KB |
Output is correct |
27 |
Correct |
878 ms |
4088 KB |
Output is correct |
28 |
Correct |
528 ms |
4096 KB |
Output is correct |
29 |
Correct |
641 ms |
4088 KB |
Output is correct |
30 |
Correct |
642 ms |
4088 KB |
Output is correct |
31 |
Correct |
646 ms |
4088 KB |
Output is correct |
32 |
Correct |
674 ms |
4088 KB |
Output is correct |
33 |
Correct |
5 ms |
384 KB |
Output is correct |
34 |
Correct |
5 ms |
384 KB |
Output is correct |
35 |
Correct |
5 ms |
640 KB |
Output is correct |
36 |
Correct |
5 ms |
640 KB |
Output is correct |
37 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
768 KB |
Output is correct |
3 |
Correct |
5 ms |
768 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Correct |
5 ms |
640 KB |
Output is correct |
6 |
Correct |
5 ms |
768 KB |
Output is correct |
7 |
Correct |
5 ms |
640 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
768 KB |
Output is correct |
10 |
Correct |
6 ms |
640 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
768 KB |
Output is correct |
13 |
Correct |
5 ms |
384 KB |
Output is correct |
14 |
Correct |
5 ms |
512 KB |
Output is correct |
15 |
Correct |
5 ms |
384 KB |
Output is correct |
16 |
Correct |
5 ms |
256 KB |
Output is correct |
17 |
Correct |
40 ms |
1536 KB |
Output is correct |
18 |
Correct |
28 ms |
1536 KB |
Output is correct |
19 |
Correct |
28 ms |
1536 KB |
Output is correct |
20 |
Correct |
20 ms |
1664 KB |
Output is correct |
21 |
Correct |
23 ms |
1536 KB |
Output is correct |
22 |
Correct |
32 ms |
1536 KB |
Output is correct |
23 |
Correct |
24 ms |
1536 KB |
Output is correct |
24 |
Correct |
11 ms |
1408 KB |
Output is correct |
25 |
Correct |
853 ms |
4088 KB |
Output is correct |
26 |
Correct |
873 ms |
4088 KB |
Output is correct |
27 |
Correct |
878 ms |
4088 KB |
Output is correct |
28 |
Correct |
528 ms |
4096 KB |
Output is correct |
29 |
Correct |
641 ms |
4088 KB |
Output is correct |
30 |
Correct |
642 ms |
4088 KB |
Output is correct |
31 |
Correct |
646 ms |
4088 KB |
Output is correct |
32 |
Correct |
674 ms |
4088 KB |
Output is correct |
33 |
Incorrect |
56 ms |
24192 KB |
Output isn't correct |
34 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3268 ms |
632 KB |
Output is correct |
2 |
Correct |
1989 ms |
604 KB |
Output is correct |
3 |
Correct |
5 ms |
512 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
19 ms |
512 KB |
Output is correct |
6 |
Correct |
19 ms |
512 KB |
Output is correct |
7 |
Correct |
19 ms |
512 KB |
Output is correct |
8 |
Correct |
22 ms |
512 KB |
Output is correct |
9 |
Correct |
19 ms |
640 KB |
Output is correct |
10 |
Correct |
14 ms |
384 KB |
Output is correct |
11 |
Correct |
16 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
512 KB |
Output is correct |
2 |
Correct |
337 ms |
95456 KB |
Output is correct |
3 |
Correct |
717 ms |
207736 KB |
Output is correct |
4 |
Correct |
769 ms |
208888 KB |
Output is correct |
5 |
Correct |
754 ms |
208776 KB |
Output is correct |
6 |
Correct |
303 ms |
103264 KB |
Output is correct |
7 |
Correct |
580 ms |
205024 KB |
Output is correct |
8 |
Correct |
650 ms |
208888 KB |
Output is correct |
9 |
Correct |
5 ms |
384 KB |
Output is correct |
10 |
Correct |
5 ms |
384 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
640 KB |
Output is correct |
13 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
768 KB |
Output is correct |
3 |
Correct |
5 ms |
768 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Correct |
5 ms |
640 KB |
Output is correct |
6 |
Correct |
5 ms |
768 KB |
Output is correct |
7 |
Correct |
5 ms |
640 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
768 KB |
Output is correct |
10 |
Correct |
6 ms |
640 KB |
Output is correct |
11 |
Correct |
5 ms |
640 KB |
Output is correct |
12 |
Correct |
5 ms |
768 KB |
Output is correct |
13 |
Correct |
5 ms |
384 KB |
Output is correct |
14 |
Correct |
5 ms |
512 KB |
Output is correct |
15 |
Correct |
5 ms |
384 KB |
Output is correct |
16 |
Correct |
5 ms |
256 KB |
Output is correct |
17 |
Correct |
40 ms |
1536 KB |
Output is correct |
18 |
Correct |
28 ms |
1536 KB |
Output is correct |
19 |
Correct |
28 ms |
1536 KB |
Output is correct |
20 |
Correct |
20 ms |
1664 KB |
Output is correct |
21 |
Correct |
23 ms |
1536 KB |
Output is correct |
22 |
Correct |
32 ms |
1536 KB |
Output is correct |
23 |
Correct |
24 ms |
1536 KB |
Output is correct |
24 |
Correct |
11 ms |
1408 KB |
Output is correct |
25 |
Correct |
853 ms |
4088 KB |
Output is correct |
26 |
Correct |
873 ms |
4088 KB |
Output is correct |
27 |
Correct |
878 ms |
4088 KB |
Output is correct |
28 |
Correct |
528 ms |
4096 KB |
Output is correct |
29 |
Correct |
641 ms |
4088 KB |
Output is correct |
30 |
Correct |
642 ms |
4088 KB |
Output is correct |
31 |
Correct |
646 ms |
4088 KB |
Output is correct |
32 |
Correct |
674 ms |
4088 KB |
Output is correct |
33 |
Incorrect |
56 ms |
24192 KB |
Output isn't correct |
34 |
Halted |
0 ms |
0 KB |
- |