#include <bits/stdc++.h>
#pragma comment(linker, "/stack:64000000")
using namespace std;
template <typename X>
inline X abs(const X &a) {
  return a < 0 ? -a : a;
}
template <typename X>
inline X sqr(const X &a) {
  return a * a;
}
const int INF = INT_MAX / 2;
const long long INF64 = LLONG_MAX / 2LL;
const long double EPS = 1E-9;
const long double PI = 3.1415926535897932384626433832795;
const int N = 2 * 1000 + 13;
int n;
inline bool correct(const pair<int, int> &a) {
  return a.first >= 0 && a.first < n && a.second >= 0 && a.second < n;
}
int a[N][N];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
bool used[N][N];
pair<pair<int, int>, pair<int, int> > bfs(int x, int y) {
  queue<pair<int, int> > q;
  q.push(make_pair(x, y));
  int minX = INF, maxX = -1, minY = INF, maxY = -1;
  while (!q.empty()) {
    pair<int, int> v = q.front();
    q.pop();
    minX = min(minX, v.first);
    maxX = max(maxX, v.first);
    minY = min(minY, v.second);
    maxY = max(maxY, v.second);
    for (int i = 0; i < int(4); i++) {
      pair<int, int> next = make_pair(v.first + dx[i], v.second + dy[i]);
      if (!correct(next)) continue;
      if (a[next.first][next.second] == 0 || used[next.first][next.second])
        continue;
      used[next.first][next.second] = true;
      q.push(next);
    }
  }
  return make_pair(make_pair(minX, maxX), make_pair(minY, maxY));
}
int main() {
  cin >> n;
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(n); j++) scanf("%d", &a[i][j]);
  int cnt1 = 0, cnt2 = 0;
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(n); j++) {
      if (used[i][j] || a[i][j] == 0) continue;
      pair<pair<int, int>, pair<int, int> > res = bfs(i, j);
      int minX = res.first.first, maxX = res.first.second,
          minY = res.second.first, maxY = res.second.second;
      if (minX != i || minY != j)
        cnt1++;
      else
        cnt2++;
    }
  }
  cout << cnt1 << ' ' << cnt2 << endl;
  return 0;
}
