#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
vector<vector<int>> a;
vector<vector<int>> sum[82];
int n,m;
// mask = D*21 + L*9 + G*3 + P
bool check(int mask, int x, int y){
pair<int,int> rx; pair<int,int> ry;
ry.second = min(m,y+mask%3); mask/=3;
rx.first = max(1,x-mask%3); mask/=3;
ry.first = max(1,y-mask%3); mask/=3;
rx.second = min(n,x+mask%3); mask/=3;
int cnt=0;
for (int z=0;z<4;z++){
if (!(rx.first<=x+d[z][0] && x+d[z][0]<=rx.second && ry.first<=y+d[z][1] && y+d[z][1]<=ry.second))continue;
int maks=0;
for (int w=0;w<4;w++){
int nx=x+d[z][0]+d[w][0]; int ny=y+d[z][1]+d[w][1];
if (rx.first<=nx && nx<=rx.second && ry.first<=ny && ny<=ry.second){
if (a[nx][ny] < a[x+d[z][0]][y+d[z][1]])maks=max(maks,a[nx][ny]);
}
}
if (maks==a[x][y])cnt++;
}
return cnt!=1;
}
int code(int d, int l, int g, int p){
int odp=min(2,p);
odp+=min(2,g)*3;
odp+=min(2,l)*9;
odp+=min(2,d)*27;
return odp;
}
int suma(int x1, int y1, int x2, int y2, int mask){
return sum[mask][x2][y2]-sum[mask][x1-1][y2]-sum[mask][x2][y1-1]+sum[mask][x1-1][y1-1];
}
// all
int calc3(int x1, int y1, int x2, int y2){
int odp=0;
for (int x=0;x<min(5,x2-x1+1);x++){
for (int y=0;y<min(5,y2-y1+1);y++){
pair<int,int> rx,ry;
if (x==0)rx={x1,x1};
else if (x==1) rx={x1+1,x1+1};
else if (x==4) rx={x1+2,x2-2};
else if (x==3) rx={x2-1,x2-1};
else if (x==2) rx={x2,x2};
if (y==0)ry={y1,y1};
else if (y==1) ry={y1+1,y1+1};
else if (y==4) ry={y1+2,y2-2};
else if (y==3) ry={y2-1,y2-1};
else if (y==2) ry={y2,y2};
odp += suma(rx.first,ry.first,rx.second,ry.second,code(x2-rx.first,ry.first-y1,rx.first-x1,y2-ry.first));
}
}
return odp;
}
// y2
int calc2(int x1, int x2, int y2){
int odp=0;
for (int x=0;x<min(5,x2-x1+1);x++){
pair<int,int> rx;
if (x==0)rx={x1,x1};
else if (x==1) rx={x1+1,x1+1};
else if (x==4) rx={x1+2,x2-2};
else if (x==3) rx={x2-1,x2-1};
else if (x==2) rx={x2,x2};
for (int y=1;y<3;y++){
pair<int,int> ry;
if (y==1) ry={y2-1,y2-1};
else if (y==2) ry={y2,y2};
odp += suma(rx.first,ry.first,rx.second,ry.second,code(x2-rx.first,100,rx.first-x1,y2-ry.first));
}
int mask=code(x2-rx.first,100,rx.first-x1,100);
odp += sum[mask][rx.second][y2-2]-sum[mask][rx.first-1][y2-2];
}
return odp;
}
// y1
int calc1(int x1, int y1, int x2){
int odp=0;
for (int x=0;x<min(5,x2-x1+1);x++){
pair<int,int> rx;
if (x==0)rx={x1,x1};
else if (x==1) rx={x1+1,x1+1};
else if (x==4) rx={x1+2,x2-2};
else if (x==3) rx={x2-1,x2-1};
else if (x==2) rx={x2,x2};
for (int y=0;y<2;y++){
pair<int,int> ry;
if (y==0)ry={y1,y1};
else if (y==1) ry={y1+1,y1+1};
odp += suma(rx.first,ry.first,rx.second,ry.second,code(x2-rx.first,ry.first-y1,rx.first-x1,100));
}
int mask = code(x2-rx.first,100,rx.first-x1,100);
odp += -sum[mask][rx.second][y1+1]+sum[mask][rx.first-1][y1+1];
}
return odp;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
// n mniejsze
vector<int> empt2(max(m,n)+3,0);
vector<vector<int>> empt(min(n,m)+3,empt2);
a=empt;
for (int x=0;x<82;x++)sum[x]=empt;
for (int x=1;x<=n;x++){
for (int y=1;y<=m;y++){
if (n<=m)cin>>a[x][y];
else cin >> a[y][x];
}
}
if (n>m)swap(n,m);
for (int mask=0;mask<81;mask++){
for (int x=1;x<=n;x++){
for (int y=1;y<=m;y++){
sum[mask][x][y]=sum[mask][x-1][y]+sum[mask][x][y-1]-sum[mask][x-1][y-1];
sum[mask][x][y]+=check(mask,x,y);
}
}
}
ll odp=0;
map<int,int> cnt;
for (int x1=1;x1<=n;x1++){
for (int x2=x1;x2<=n;x2++){
cnt.clear();
for (int y2=1;y2<=m;y2++){
odp += cnt[calc2(x1,x2,y2)];
if (y2>3)cnt[1-calc1(x1,y2-3,x2)]++;
for (int y1=max(1,y2-3);y1<=y2;y1++){
if (calc3(x1,y1,x2,y2)==1){
odp++;
}
}
}
}
}
/*for (int x=1;x<=3;x++){
cout << check(code(0,x-1,0,3-x),1,x) << ' ';
}
cout << '\n';
cout << calc(1,1,1,3) << '\n';*/
cout << odp << '\n';
}
# | 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... |