This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "rect.h"
using namespace std;
using ll=long long;
const ll TAILLE_MAX=2505,DECA=(1<<12);
ll rep,nbLig,nbCol;
ll val[TAILLE_MAX][TAILLE_MAX];
ll limite[TAILLE_MAX][TAILLE_MAX][4];
ll limCalc[TAILLE_MAX][2];
ll arbreMin[TAILLE_MAX][2*DECA],arbreMax[TAILLE_MAX][2*DECA];
bool checkCol(ll col,ll ligHaut,ll ligBas) {
if (limite[ligHaut-1][col][3]>=ligBas and limite[ligBas+1][col][2]<=ligHaut) {
return true;
}
return false;
}
ll calcMin(ll tab,ll deb,ll fin) {
if (deb==fin) {
return arbreMin[tab][deb];
}
if (deb%2==1) {
return min(arbreMin[tab][deb],calcMin(tab,deb+1,fin));
}
if (fin%2==0) {
return min(arbreMin[tab][fin],calcMin(tab,deb,fin-1));
}
return calcMin(tab,deb/2,fin/2);
}
ll calcMax(ll tab,ll deb,ll fin) {
if (deb==fin) {
return arbreMax[tab][deb];
}
if (deb%2==1) {
return max(arbreMax[tab][deb],calcMax(tab,deb+1,fin));
}
if (fin%2==0) {
return max(arbreMax[tab][fin],calcMax(tab,deb,fin-1));
}
return calcMax(tab,deb/2,fin/2);
}
void calc(ll ligHaut,ll ligBas,ll colGau,ll colDroi) {
//cout<<ligHaut<<" "<<ligBas<<" "<<colGau<<" "<<colDroi<<" : ";
for (ll i=colGau-1;i<=colDroi+1;i++) {
limCalc[i][0]=calcMax(i,DECA+ligHaut,DECA+ligBas);
limCalc[i][1]=calcMin(i,DECA+ligHaut,DECA+ligBas);
//cout<<i<<" "<<limCalc[i][0]<<" "<<limCalc[i][1]<<" ";
}
//cout<<endl;
for (ll i=colGau;i<=colDroi;i++) {
for (ll j=i;j<=colDroi;j++) {
if (limCalc[i-1][1]>=j and limCalc[j+1][0]<=i) {
//cout<<"! "<<ligHaut<<" "<<ligBas<<" "<<i<<" "<<j<<endl;
rep++;
}
}
}
}
ll count_rectangles(vector<vector<int>> a) {
nbLig=a.size();
nbCol=a[0].size();
if (nbLig<=2 or nbCol<=2) {
return 0;
}
for (ll i=0;i<nbLig;i++) {
for (ll j=0;j<nbCol;j++) {
val[i][j]=a[i][j];
}
}
ll deb,pos;
for (ll i=0;i<nbLig;i++) {
for (ll j=0;j<nbCol;j++) {
pos=j;
while (pos>0 and val[i][j]>val[i][pos-1]) {
pos--;
}
limite[i][j][0]=pos;
pos=j;
while (pos<nbCol-1 and val[i][j]>val[i][pos+1]) {
pos++;
}
limite[i][j][1]=pos;
pos=i;
while (pos>0 and val[i][j]>val[pos-1][j]) {
pos--;
}
limite[i][j][2]=pos;
pos=i;
while (pos<nbLig-1 and val[i][j]>val[pos+1][j]) {
pos++;
}
limite[i][j][3]=pos;
//cout<<i<<" "<<j<<" : "<<limite[i][j][0]<<" "<<limite[i][j][1]<<endl;
}
}
for (ll i=0;i<nbCol;i++) {
for (ll j=0;j<2*DECA;j++) {
arbreMin[i][j]=nbCol-1;
arbreMax[i][j]=0;
}
for (ll j=0;j<nbLig;j++) {
arbreMin[i][DECA+j]=limite[j][i][1];
arbreMax[i][DECA+j]=limite[j][i][0];
}
for (ll j=DECA-1;j>0;j--) {
arbreMin[i][j]=min(arbreMin[i][2*j],arbreMin[i][2*j+1]);
arbreMax[i][j]=max(arbreMax[i][2*j],arbreMax[i][2*j+1]);
}
}
for (ll ligHaut=1;ligHaut<nbLig-1;ligHaut++) {
for (ll ligBas=ligHaut;ligBas<nbLig-1;ligBas++) {
pos=1;
while (pos<nbCol-1) {
deb=pos;
while (pos<nbCol-1 and checkCol(pos,ligHaut,ligBas)) {
pos++;
}
if (pos>deb) {
calc(ligHaut,ligBas,deb,pos-1);
}
pos++;
}
}
}
return rep;
}
# | 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... |