#include "rect.h"
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 2505;
vector<int> e[maxn][maxn];
int ri[maxn], li[maxn];
ll ans = 0;
struct obdl
{
int x1, y1, x2, y2, t;
};
void make(const vector<vector<int> > &a, vector<obdl> &o, int t)
{
int n = a.size(), m = a[0].size();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++) ri[j] = m, li[j] = -1;
vector<int> st;
for (int j = 0; j < m; j++) // najdeme najblizsi vacsi
{
while (!st.empty() && a[i][j] > a[i][st.back()]) st.pop_back();
if (!st.empty() && st.back() + 1 < j) li[j] = st.back();
st.push_back(j);
}
st.clear();
for (int j = m - 1; j >= 0; j--) // najdeme najblizsi vacsi
{
while (!st.empty() && a[i][j] > a[i][st.back()]) st.pop_back();
if (!st.empty() && st.back() - 1 > j) ri[j] = st.back();
st.push_back(j);
}
for (int j = 0; j < m; j++)
{
if (ri[j] != m && li[ri[j]] <= j) e[j + 1][ri[j] - 1].push_back(i);
if (li[j] != -1 && ri[li[j]] >= j) e[li[j] + 1][j - 1].push_back(i);
}
}
for (int y1 = 0; y1 < m; y1++) for (int y2 = y1; y2 < m; y2++)
{
for (int i = 0; i < e[y1][y2].size(); i++) if (!i || e[y1][y2][i - 1] + 1 < e[y1][y2][i])
{
int j = i;
while (j + 1 < e[y1][y2].size() && e[y1][y2][j] >= e[y1][y2][j + 1] - 1) j++;
o.push_back({ e[y1][y2][i], y1, e[y1][y2][j], y2, t });
}
e[y1][y2].clear();
}
}
int st[maxn];
void upd(int i, int x)
{
for (; i < maxn; i = (i | (i + 1))) st[i] += x;
}
int query(int r)
{
int ans = 0;
for (; r >= 0; r = (r & (r + 1)) - 1) ans += st[r];
return ans;
}
bool cmp(obdl a, obdl b)
{
if (a.x2 == b.x2) return a.t > b.t;
return a.x2 < b.x2;
}
ll count_rectangles(vector<vector<int> > a)
{
int n = a.size(), m = a[0].size();
vector<obdl> ob;
vector<vector<int> > b(m, vector<int>(n));
for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) b[j][i] = a[i][j];
make(b, ob, 2);
for (obdl& i : ob) swap(i.x1, i.y1), swap(i.x2, i.y2);
make(a, ob, 1);
sort(ob.begin(), ob.end(), cmp);
for (int i = 0; i < ob.size(); i++)
{
if (ob[i].t == 1) for (int x1 = ob[i].x1; x1 <= ob[i].x2; x1++) e[x1][ob[i].y1].push_back(i);
if (ob[i].t == 2) for (int y1 = ob[i].y1; y1 <= ob[i].y2; y1++) e[ob[i].x1][y1].push_back(i);
}
ll ans = 0;
for (int x = 1; x + 1 < n; x++) for (int y = 1; y + 1 < m; y++)
{
ll sum = 0, all = 0;
for (int u : e[x][y])
{
if (ob[u].t == 2) upd(ob[u].y2, 1), all++;
else sum += all - query(ob[u].y2 - 1);
}
for (int u : e[x][y]) if (ob[u].t == 2) upd(ob[u].y2, -1);
ans += sum;
//cout << sum << " \n"[y == m - 2];
}
return ans;
}
Compilation message
rect.cpp: In function 'void make(const std::vector<std::vector<int> >&, std::vector<obdl>&, int)':
rect.cpp:42:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
42 | for (int i = 0; i < e[y1][y2].size(); i++) if (!i || e[y1][y2][i - 1] + 1 < e[y1][y2][i])
| ~~^~~~~~~~~~~~~~~~~~
rect.cpp:45:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
45 | while (j + 1 < e[y1][y2].size() && e[y1][y2][j] >= e[y1][y2][j + 1] - 1) j++;
| ~~~~~~^~~~~~~~~~~~~~~~~~
rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:77:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<obdl>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
77 | for (int i = 0; i < ob.size(); i++)
| ~~^~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
75 ms |
147648 KB |
Output is correct |
2 |
Correct |
64 ms |
147616 KB |
Output is correct |
3 |
Correct |
65 ms |
147616 KB |
Output is correct |
4 |
Correct |
67 ms |
147612 KB |
Output is correct |
5 |
Correct |
67 ms |
147628 KB |
Output is correct |
6 |
Correct |
73 ms |
147772 KB |
Output is correct |
7 |
Correct |
74 ms |
147572 KB |
Output is correct |
8 |
Correct |
66 ms |
147660 KB |
Output is correct |
9 |
Correct |
66 ms |
147680 KB |
Output is correct |
10 |
Correct |
66 ms |
147644 KB |
Output is correct |
11 |
Correct |
65 ms |
147648 KB |
Output is correct |
12 |
Correct |
66 ms |
147640 KB |
Output is correct |
13 |
Correct |
65 ms |
147572 KB |
Output is correct |
14 |
Correct |
66 ms |
147580 KB |
Output is correct |
15 |
Correct |
66 ms |
147660 KB |
Output is correct |
16 |
Correct |
65 ms |
147572 KB |
Output is correct |
17 |
Correct |
65 ms |
147608 KB |
Output is correct |
18 |
Correct |
66 ms |
147540 KB |
Output is correct |
19 |
Correct |
66 ms |
147656 KB |
Output is correct |
20 |
Correct |
67 ms |
147544 KB |
Output is correct |
21 |
Correct |
66 ms |
147600 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
75 ms |
147648 KB |
Output is correct |
2 |
Correct |
64 ms |
147616 KB |
Output is correct |
3 |
Correct |
65 ms |
147616 KB |
Output is correct |
4 |
Correct |
67 ms |
147612 KB |
Output is correct |
5 |
Correct |
67 ms |
147628 KB |
Output is correct |
6 |
Correct |
73 ms |
147772 KB |
Output is correct |
7 |
Correct |
74 ms |
147572 KB |
Output is correct |
8 |
Correct |
66 ms |
147660 KB |
Output is correct |
9 |
Correct |
66 ms |
147680 KB |
Output is correct |
10 |
Correct |
66 ms |
147644 KB |
Output is correct |
11 |
Correct |
65 ms |
147648 KB |
Output is correct |
12 |
Correct |
66 ms |
147640 KB |
Output is correct |
13 |
Correct |
65 ms |
147572 KB |
Output is correct |
14 |
Correct |
66 ms |
147580 KB |
Output is correct |
15 |
Correct |
66 ms |
147660 KB |
Output is correct |
16 |
Correct |
65 ms |
147572 KB |
Output is correct |
17 |
Correct |
65 ms |
147608 KB |
Output is correct |
18 |
Correct |
66 ms |
147540 KB |
Output is correct |
19 |
Correct |
66 ms |
147656 KB |
Output is correct |
20 |
Correct |
67 ms |
147544 KB |
Output is correct |
21 |
Correct |
66 ms |
147600 KB |
Output is correct |
22 |
Correct |
67 ms |
147960 KB |
Output is correct |
23 |
Correct |
71 ms |
148036 KB |
Output is correct |
24 |
Correct |
72 ms |
148140 KB |
Output is correct |
25 |
Correct |
68 ms |
147948 KB |
Output is correct |
26 |
Correct |
68 ms |
148264 KB |
Output is correct |
27 |
Correct |
69 ms |
148292 KB |
Output is correct |
28 |
Correct |
71 ms |
148172 KB |
Output is correct |
29 |
Correct |
68 ms |
147844 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
75 ms |
147648 KB |
Output is correct |
2 |
Correct |
64 ms |
147616 KB |
Output is correct |
3 |
Correct |
65 ms |
147616 KB |
Output is correct |
4 |
Correct |
67 ms |
147612 KB |
Output is correct |
5 |
Correct |
67 ms |
147628 KB |
Output is correct |
6 |
Correct |
73 ms |
147772 KB |
Output is correct |
7 |
Correct |
74 ms |
147572 KB |
Output is correct |
8 |
Correct |
66 ms |
147660 KB |
Output is correct |
9 |
Correct |
66 ms |
147680 KB |
Output is correct |
10 |
Correct |
66 ms |
147644 KB |
Output is correct |
11 |
Correct |
65 ms |
147648 KB |
Output is correct |
12 |
Correct |
66 ms |
147640 KB |
Output is correct |
13 |
Correct |
65 ms |
147572 KB |
Output is correct |
14 |
Correct |
66 ms |
147580 KB |
Output is correct |
15 |
Correct |
66 ms |
147660 KB |
Output is correct |
16 |
Correct |
65 ms |
147572 KB |
Output is correct |
17 |
Correct |
67 ms |
147960 KB |
Output is correct |
18 |
Correct |
71 ms |
148036 KB |
Output is correct |
19 |
Correct |
72 ms |
148140 KB |
Output is correct |
20 |
Correct |
68 ms |
147948 KB |
Output is correct |
21 |
Correct |
68 ms |
148264 KB |
Output is correct |
22 |
Correct |
69 ms |
148292 KB |
Output is correct |
23 |
Correct |
71 ms |
148172 KB |
Output is correct |
24 |
Correct |
68 ms |
147844 KB |
Output is correct |
25 |
Correct |
65 ms |
147608 KB |
Output is correct |
26 |
Correct |
66 ms |
147540 KB |
Output is correct |
27 |
Correct |
66 ms |
147656 KB |
Output is correct |
28 |
Correct |
67 ms |
147544 KB |
Output is correct |
29 |
Correct |
66 ms |
147600 KB |
Output is correct |
30 |
Correct |
72 ms |
149828 KB |
Output is correct |
31 |
Correct |
74 ms |
149708 KB |
Output is correct |
32 |
Correct |
73 ms |
149920 KB |
Output is correct |
33 |
Correct |
76 ms |
149504 KB |
Output is correct |
34 |
Correct |
88 ms |
150684 KB |
Output is correct |
35 |
Correct |
87 ms |
150856 KB |
Output is correct |
36 |
Correct |
82 ms |
150408 KB |
Output is correct |
37 |
Correct |
85 ms |
150448 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
75 ms |
147648 KB |
Output is correct |
2 |
Correct |
64 ms |
147616 KB |
Output is correct |
3 |
Correct |
65 ms |
147616 KB |
Output is correct |
4 |
Correct |
67 ms |
147612 KB |
Output is correct |
5 |
Correct |
67 ms |
147628 KB |
Output is correct |
6 |
Correct |
73 ms |
147772 KB |
Output is correct |
7 |
Correct |
74 ms |
147572 KB |
Output is correct |
8 |
Correct |
66 ms |
147660 KB |
Output is correct |
9 |
Correct |
66 ms |
147680 KB |
Output is correct |
10 |
Correct |
66 ms |
147644 KB |
Output is correct |
11 |
Correct |
65 ms |
147648 KB |
Output is correct |
12 |
Correct |
66 ms |
147640 KB |
Output is correct |
13 |
Correct |
65 ms |
147572 KB |
Output is correct |
14 |
Correct |
66 ms |
147580 KB |
Output is correct |
15 |
Correct |
66 ms |
147660 KB |
Output is correct |
16 |
Correct |
65 ms |
147572 KB |
Output is correct |
17 |
Correct |
67 ms |
147960 KB |
Output is correct |
18 |
Correct |
71 ms |
148036 KB |
Output is correct |
19 |
Correct |
72 ms |
148140 KB |
Output is correct |
20 |
Correct |
68 ms |
147948 KB |
Output is correct |
21 |
Correct |
68 ms |
148264 KB |
Output is correct |
22 |
Correct |
69 ms |
148292 KB |
Output is correct |
23 |
Correct |
71 ms |
148172 KB |
Output is correct |
24 |
Correct |
68 ms |
147844 KB |
Output is correct |
25 |
Correct |
72 ms |
149828 KB |
Output is correct |
26 |
Correct |
74 ms |
149708 KB |
Output is correct |
27 |
Correct |
73 ms |
149920 KB |
Output is correct |
28 |
Correct |
76 ms |
149504 KB |
Output is correct |
29 |
Correct |
88 ms |
150684 KB |
Output is correct |
30 |
Correct |
87 ms |
150856 KB |
Output is correct |
31 |
Correct |
82 ms |
150408 KB |
Output is correct |
32 |
Correct |
85 ms |
150448 KB |
Output is correct |
33 |
Correct |
65 ms |
147608 KB |
Output is correct |
34 |
Correct |
66 ms |
147540 KB |
Output is correct |
35 |
Correct |
66 ms |
147656 KB |
Output is correct |
36 |
Correct |
67 ms |
147544 KB |
Output is correct |
37 |
Correct |
66 ms |
147600 KB |
Output is correct |
38 |
Correct |
217 ms |
181336 KB |
Output is correct |
39 |
Correct |
202 ms |
179028 KB |
Output is correct |
40 |
Correct |
188 ms |
178968 KB |
Output is correct |
41 |
Correct |
167 ms |
176676 KB |
Output is correct |
42 |
Correct |
171 ms |
174828 KB |
Output is correct |
43 |
Correct |
164 ms |
177680 KB |
Output is correct |
44 |
Correct |
181 ms |
175268 KB |
Output is correct |
45 |
Correct |
170 ms |
176308 KB |
Output is correct |
46 |
Correct |
153 ms |
165956 KB |
Output is correct |
47 |
Correct |
201 ms |
170140 KB |
Output is correct |
48 |
Correct |
319 ms |
184768 KB |
Output is correct |
49 |
Correct |
346 ms |
186904 KB |
Output is correct |
50 |
Correct |
202 ms |
168000 KB |
Output is correct |
51 |
Correct |
207 ms |
167932 KB |
Output is correct |
52 |
Correct |
322 ms |
181220 KB |
Output is correct |
53 |
Correct |
303 ms |
182300 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
95 ms |
148412 KB |
Output is correct |
2 |
Correct |
80 ms |
148184 KB |
Output is correct |
3 |
Correct |
82 ms |
147872 KB |
Output is correct |
4 |
Correct |
69 ms |
147556 KB |
Output is correct |
5 |
Correct |
93 ms |
148300 KB |
Output is correct |
6 |
Correct |
93 ms |
148376 KB |
Output is correct |
7 |
Correct |
84 ms |
148416 KB |
Output is correct |
8 |
Correct |
81 ms |
148248 KB |
Output is correct |
9 |
Correct |
83 ms |
148424 KB |
Output is correct |
10 |
Correct |
79 ms |
147940 KB |
Output is correct |
11 |
Correct |
81 ms |
148276 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
65 ms |
147608 KB |
Output is correct |
2 |
Correct |
66 ms |
147540 KB |
Output is correct |
3 |
Correct |
66 ms |
147656 KB |
Output is correct |
4 |
Correct |
67 ms |
147544 KB |
Output is correct |
5 |
Correct |
66 ms |
147600 KB |
Output is correct |
6 |
Correct |
75 ms |
147596 KB |
Output is correct |
7 |
Correct |
712 ms |
260180 KB |
Output is correct |
8 |
Correct |
1412 ms |
381760 KB |
Output is correct |
9 |
Correct |
1338 ms |
382876 KB |
Output is correct |
10 |
Correct |
1336 ms |
382936 KB |
Output is correct |
11 |
Correct |
183 ms |
190128 KB |
Output is correct |
12 |
Correct |
290 ms |
228236 KB |
Output is correct |
13 |
Correct |
303 ms |
233564 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
75 ms |
147648 KB |
Output is correct |
2 |
Correct |
64 ms |
147616 KB |
Output is correct |
3 |
Correct |
65 ms |
147616 KB |
Output is correct |
4 |
Correct |
67 ms |
147612 KB |
Output is correct |
5 |
Correct |
67 ms |
147628 KB |
Output is correct |
6 |
Correct |
73 ms |
147772 KB |
Output is correct |
7 |
Correct |
74 ms |
147572 KB |
Output is correct |
8 |
Correct |
66 ms |
147660 KB |
Output is correct |
9 |
Correct |
66 ms |
147680 KB |
Output is correct |
10 |
Correct |
66 ms |
147644 KB |
Output is correct |
11 |
Correct |
65 ms |
147648 KB |
Output is correct |
12 |
Correct |
66 ms |
147640 KB |
Output is correct |
13 |
Correct |
65 ms |
147572 KB |
Output is correct |
14 |
Correct |
66 ms |
147580 KB |
Output is correct |
15 |
Correct |
66 ms |
147660 KB |
Output is correct |
16 |
Correct |
65 ms |
147572 KB |
Output is correct |
17 |
Correct |
67 ms |
147960 KB |
Output is correct |
18 |
Correct |
71 ms |
148036 KB |
Output is correct |
19 |
Correct |
72 ms |
148140 KB |
Output is correct |
20 |
Correct |
68 ms |
147948 KB |
Output is correct |
21 |
Correct |
68 ms |
148264 KB |
Output is correct |
22 |
Correct |
69 ms |
148292 KB |
Output is correct |
23 |
Correct |
71 ms |
148172 KB |
Output is correct |
24 |
Correct |
68 ms |
147844 KB |
Output is correct |
25 |
Correct |
72 ms |
149828 KB |
Output is correct |
26 |
Correct |
74 ms |
149708 KB |
Output is correct |
27 |
Correct |
73 ms |
149920 KB |
Output is correct |
28 |
Correct |
76 ms |
149504 KB |
Output is correct |
29 |
Correct |
88 ms |
150684 KB |
Output is correct |
30 |
Correct |
87 ms |
150856 KB |
Output is correct |
31 |
Correct |
82 ms |
150408 KB |
Output is correct |
32 |
Correct |
85 ms |
150448 KB |
Output is correct |
33 |
Correct |
217 ms |
181336 KB |
Output is correct |
34 |
Correct |
202 ms |
179028 KB |
Output is correct |
35 |
Correct |
188 ms |
178968 KB |
Output is correct |
36 |
Correct |
167 ms |
176676 KB |
Output is correct |
37 |
Correct |
171 ms |
174828 KB |
Output is correct |
38 |
Correct |
164 ms |
177680 KB |
Output is correct |
39 |
Correct |
181 ms |
175268 KB |
Output is correct |
40 |
Correct |
170 ms |
176308 KB |
Output is correct |
41 |
Correct |
153 ms |
165956 KB |
Output is correct |
42 |
Correct |
201 ms |
170140 KB |
Output is correct |
43 |
Correct |
319 ms |
184768 KB |
Output is correct |
44 |
Correct |
346 ms |
186904 KB |
Output is correct |
45 |
Correct |
202 ms |
168000 KB |
Output is correct |
46 |
Correct |
207 ms |
167932 KB |
Output is correct |
47 |
Correct |
322 ms |
181220 KB |
Output is correct |
48 |
Correct |
303 ms |
182300 KB |
Output is correct |
49 |
Correct |
95 ms |
148412 KB |
Output is correct |
50 |
Correct |
80 ms |
148184 KB |
Output is correct |
51 |
Correct |
82 ms |
147872 KB |
Output is correct |
52 |
Correct |
69 ms |
147556 KB |
Output is correct |
53 |
Correct |
93 ms |
148300 KB |
Output is correct |
54 |
Correct |
93 ms |
148376 KB |
Output is correct |
55 |
Correct |
84 ms |
148416 KB |
Output is correct |
56 |
Correct |
81 ms |
148248 KB |
Output is correct |
57 |
Correct |
83 ms |
148424 KB |
Output is correct |
58 |
Correct |
79 ms |
147940 KB |
Output is correct |
59 |
Correct |
81 ms |
148276 KB |
Output is correct |
60 |
Correct |
75 ms |
147596 KB |
Output is correct |
61 |
Correct |
712 ms |
260180 KB |
Output is correct |
62 |
Correct |
1412 ms |
381760 KB |
Output is correct |
63 |
Correct |
1338 ms |
382876 KB |
Output is correct |
64 |
Correct |
1336 ms |
382936 KB |
Output is correct |
65 |
Correct |
183 ms |
190128 KB |
Output is correct |
66 |
Correct |
290 ms |
228236 KB |
Output is correct |
67 |
Correct |
303 ms |
233564 KB |
Output is correct |
68 |
Correct |
65 ms |
147608 KB |
Output is correct |
69 |
Correct |
66 ms |
147540 KB |
Output is correct |
70 |
Correct |
66 ms |
147656 KB |
Output is correct |
71 |
Correct |
67 ms |
147544 KB |
Output is correct |
72 |
Correct |
66 ms |
147600 KB |
Output is correct |
73 |
Correct |
2617 ms |
544068 KB |
Output is correct |
74 |
Correct |
2858 ms |
512956 KB |
Output is correct |
75 |
Correct |
2016 ms |
513196 KB |
Output is correct |
76 |
Correct |
1688 ms |
489772 KB |
Output is correct |
77 |
Correct |
1631 ms |
460552 KB |
Output is correct |
78 |
Correct |
2373 ms |
440296 KB |
Output is correct |
79 |
Correct |
2545 ms |
448316 KB |
Output is correct |
80 |
Correct |
3955 ms |
601064 KB |
Output is correct |
81 |
Correct |
2468 ms |
431048 KB |
Output is correct |
82 |
Correct |
3243 ms |
530832 KB |
Output is correct |
83 |
Correct |
4030 ms |
607904 KB |
Output is correct |
84 |
Correct |
1976 ms |
392712 KB |
Output is correct |
85 |
Correct |
3362 ms |
554028 KB |
Output is correct |
86 |
Correct |
3153 ms |
540720 KB |
Output is correct |
87 |
Correct |
1119 ms |
352436 KB |
Output is correct |
88 |
Correct |
1561 ms |
457028 KB |
Output is correct |
89 |
Correct |
1553 ms |
457312 KB |
Output is correct |
90 |
Correct |
1562 ms |
457196 KB |
Output is correct |