#include <bits/stdc++.h>
using namespace std;
int maze[2005][2005];
int used[2005][2005];
int dir[8][2] = {{0, 1}, {0, -1}, {1, 0},  {-1, 0},
                 {1, 1}, {-1, 1}, {1, -1}, {-1, -1}};
int n;
bool check(int x, int y) {
  return x >= 1 && x <= n && y >= 1 && y <= n && maze[x][y] == 1 &&
         used[x][y] == 0;
}
int l, r, up, down, idx = 0;
queue<pair<int, int> > Q;
void dfs(int x1, int y1) {
  while (Q.empty() != true) Q.pop();
  Q.push(make_pair(x1, y1));
  used[x1][y1] = ++idx;
  while (Q.empty() != true) {
    pair<int, int> p = Q.front();
    Q.pop();
    int x = p.first, y = p.second;
    if (y <= l) l = y;
    if (y >= r) r = y;
    if (x <= up) up = x;
    if (x >= down) down = x;
    for (int i = 0; i < 8; i++) {
      if (check(x + dir[i][0], y + dir[i][1]) == true) {
        used[x + dir[i][0]][y + dir[i][1]] = idx;
        Q.push(make_pair(x + dir[i][0], y + dir[i][1]));
      }
    }
  }
  return;
}
int main() {
  int i, j, k;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) scanf("%d", &maze[i][j]);
  }
  int ans1 = 0, ans2 = 0;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      if (maze[i][j] == 0 || used[i][j] != 0) continue;
      idx++;
      l = n;
      r = 1;
      up = n;
      down = 1;
      dfs(i, j);
      if (used[up][l] == idx && used[down][r] == idx)
        ans1++;
      else
        ans2++;
    }
  }
  printf("%d %d\n", ans2, ans1);
}
