1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 using namespace std;
6
7 const int px[8]={-1,-1,0,1,1,1,0,-1};
8 const int py[8]={0,1,1,1,0,-1,-1,-1};
9 int map[1001][1001],x[1000001],y[1000001],n,valleys,ridges;
10 bool vis[1001][1001];
11
12 bool check(int pos,char sym){
13 for(int k=1;k<=pos;k++)
14 for(int i=0;i<8;i++){
15 int xx=x[k]+px[i],yy=y[k]+py[i];
16 if(!(xx>0&&xx<=n&&yy>0&&yy<=n)) continue;
17 if((sym==‘v‘&&map[xx][yy]<map[x[k]][y[k]])||(sym==‘r‘&&map[xx][yy]>map[x[k]][y[k]])) return false;
18 }
19 return true;
20 }
21
22 void bfs(int posx,int posy){
23 int head=1,tail=0,xx,yy;
24 x[++tail]=posx,y[tail]=posy;
25 while(head<=tail){
26 for(int i=0;i<8;i++){
27 xx=x[head]+px[i],yy=y[head]+py[i];
28 if(!(xx>0&&xx<=n&&yy>0&&yy<=n&&map[xx][yy]==map[posx][posy]&&!vis[xx][yy])) continue;
29 vis[xx][yy]=true;
30 x[++tail]=xx,y[tail]=yy;
31 }
32 head++;
33 }
34 if(check(tail,‘v‘)) valleys++;
35 if(check(tail,‘r‘)) ridges++;
36 }
37
38 int main(){
39 scanf("%d",&n);
40 for(int i=1;i<=n;i++)
41 for(int j=1;j<=n;j++) scanf("%d",&map[i][j]);
42 memset(vis,false,sizeof(vis));
43 for(int i=1;i<=n;i++)
44 for(int j=1;j<=n;j++)
45 if(!vis[i][j]) bfs(i,j);
46 printf("%d %d\n",ridges,valleys);
47 return 0;
48 }