#include "rect.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 2505;
int N, M, fen[MAXN];
ll ans;
pii B[MAXN][MAXN];
vector <pii> C[2][MAXN][MAXN];
int pref(int x) {
int sum = 0;
for (int i=x;i;i-=i&-i) {
sum += fen[i];
}
return sum;
}
void add(int x,int y) {
for (int i=x;i<MAXN;i+=i&-i) {
fen[i] += y;
}
}
void reset() {
for (int i=0;i<MAXN;i++) {
for (int j=i+2;j<MAXN;j++) {
B[i][j] = {-1,-1};
}
}
}
void get(int i,int x,int y,int t) {
if (y-x == 1) return;
if (B[x][y].se == i-1) {
B[x][y].se++;
}
else {
B[x][y] = {i,i};
}
C[t][i][y-1].push_back({x+1,B[x][y].fi});
}
void solve(int x,int y) {
vector <pii> &A = C[0][x][y];
vector <pii> &B = C[1][y][x];
for (pii &x : B) {
swap(x.fi,x.se);
}
sort(A.begin(),A.end());
sort(B.begin(),B.end());
int j=0;
for (int i=0;i<(int)A.size();i++) {
while (j<(int)B.size() && B[j].fi<=A[i].fi) {
add(B[j].se,1);
j++;
}
ans += j-pref(A[i].se-1);
}
for (int i=0;i<j;i++) {
add(B[i].se,-1);
}
}
ll count_rectangles(vector<vector<int> > A) {
N = A.size();
M = A[0].size();
reset();
for (int i=1;i<N-1;i++) {
stack <pii> S;
for (int j=0;j<M;j++) {
while (!S.empty() && S.top().fi < A[i][j]) {
get(i,S.top().se,j,0);
S.pop();
}
if (!S.empty()) {
get(i,S.top().se,j,0);
if (S.top().fi == A[i][j]) {
S.pop();
}
}
S.push({A[i][j],j});
}
}
reset();
for (int i=1;i<M-1;i++) {
stack <pii> S;
for (int j=0;j<N;j++) {
while (!S.empty() && S.top().fi < A[j][i]) {
get(i,S.top().se,j,1);
S.pop();
}
if (!S.empty()) {
get(i,S.top().se,j,1);
if (S.top().fi == A[j][i]) {
S.pop();
}
}
S.push({A[j][i],j});
}
}
for (int i=1;i<N-1;i++) {
for (int j=1;j<M-1;j++) {
if (!C[0][i][j].empty() && !C[1][j][i].empty()) {
solve(i,j);
}
}
}
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... |