#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)
struct ST{
int l, r;
ST *lt, *rt;
int mx;
void comb() {
mx = max(lt->mx, rt->mx);
}
ST(int bl, int br, vector<int> &a) {
lt = rt = nullptr;
l = bl, r = br;
if(l == r) {
mx = a[l];
} else {
int m = (l+r)/2;
lt = new ST(l, m, a);
rt = new ST(m+1, r, a);
comb();
}
}
int qry(int ql, int qr) {
if(qr < l || r < ql) return -1;
if(ql <= l && r <= qr) return mx;
else return max(lt->qry(ql, qr), rt->qry(ql, qr));
}
};
struct Bounds{
int x1, x2, y1, y2;
Bounds(int a, int b, int c, int d): x1(a), x2(b), y1(c), y2(d) {};
};
ll count_rectangles(vector<vector<int>> arr) {
int r = size(arr);
int c = size(arr[0]);
vector<vector<int>> rotatedArr(c, vector<int>(r, 0));
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
rotatedArr[j][i] = arr[i][j];
}
}
vector<vector<int>> maxUp(r, vector<int>(c, -1));
vector<vector<int>> maxDown(r, vector<int>(c, -1));
vector<vector<int>> maxLeft(r, vector<int>(c, -1));
vector<vector<int>> maxRight(r, vector<int>(c, -1));
vector<Bounds> valid;
for(int y = 1; y < r-1; y++) {
for(int x = 1; x < c-1; x++) {
int xl = x-1, xr = x+1;
int yu = y-1, yd = y+1;
for(; xl >= 0; xl--) if(arr[y][xl] > arr[y][x]) break;
for(; xr < c; xr++) if(arr[y][xr] > arr[y][x]) break;
for(; yu >= 0; yu--) if(arr[yu][x] > arr[y][x]) break;
for(; yd < r; yd++) if(arr[yd][x] > arr[y][x]) break;
if(yu >= 0 && yd < r && xl >= 0 && xr < c) {
valid.push_back(Bounds(xl+1, xr-1, yu+1, yd-1));
}
}
}
vector<ST> rows, cols;
for(int i = 0; i < r; i++) {
rows.push_back(ST(0, c-1, arr[i]));
}
for(int i = 0; i < c; i++) {
cols.push_back(ST(0, r-1, rotatedArr[i]));
}
ll ans = 0;
for(Bounds i : valid) {
bool validRect = true;
int xl = i.x1;
int xr = i.x2;
int yl = i.y1;
int yr = i.y2;
for(int x = xl; x <= xr; x++) {
validRect &= min(arr[yl-1][x], arr[yr+1][x]) > cols[x].qry(yl, yr);
}
for(int y = yl; y <= yr; y++) {
validRect &= min(arr[y][xl-1], arr[y][xr+1]) > rows[y].qry(xl, xr);
}
ans += validRect;
}
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... |