#include <bits/stdc++.h>
using namespace std;
template <typename type>
inline static void _cutedebug(const type &a) {
  cerr << a;
}
template <typename type1, typename type2>
inline static void _cutedebug(const pair<type1, type2> &a) {
  cerr << "(";
  _cutedebug(a.first);
  cerr << ", ";
  _cutedebug(a.second);
  cerr << ")";
}
template <typename type>
inline static void _cutedebug(const vector<type> &a) {
  cerr << "[";
  bool flag = true;
  for (typename vector<type>::const_iterator i = a.begin(); i != a.end(); i++) {
    if (flag)
      flag = false;
    else
      cerr << ", ";
    _cutedebug(*i);
  }
  cerr << "]";
}
template <typename type>
inline static void _cutedebug(const set<type> &a) {
  cerr << "{";
  bool flag = true;
  for (typename set<type>::const_iterator i = a.begin(); i != a.end(); i++) {
    if (flag)
      flag = false;
    else
      cerr << ", ";
    _cutedebug(*i);
  }
  cerr << "}";
}
template <typename type1, typename type2>
inline static void _cutedebug(const map<type1, type2> &a) {
  cerr << "{";
  bool flag = true;
  for (typename map<type1, type2>::const_iterator i = a.begin(); i != a.end();
       i++) {
    if (flag)
      flag = false;
    else
      cerr << ", ";
    cerr << "(";
    _cutedebug((*i).first);
    cerr << ": ";
    _cutedebug((*i).second);
    cerr << ")";
  }
  cerr << "}";
}
const char *fin = "input.txt";
const char *fout = "output.txt";
const int inf = (1 << 30);
const long long linf = (long long(1) << 61);
const int cmax = 3000;
const int cx[] = {1, 0, -1, 0, -1, -1, 1, 1};
const int cy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int n;
int a[cmax][cmax];
bool cool[cmax][cmax];
int dist[cmax][cmax], clr[cmax][cmax];
int queuex[cmax * cmax], queuey[cmax * cmax];
int bx[cmax], by[cmax], cnf[cmax], ctot[cmax];
void bfs(int x, int y, int c) {
  clr[x][y] = c;
  int l = 0, r = 0;
  queuex[r] = x;
  queuey[r] = y;
  ++r;
  while (r > l) {
    int x = queuex[l], y = queuey[l];
    ++l;
    for (int i = 0; i < 4; i++) {
      int nx = x + cx[i], ny = y + cy[i];
      if (nx < 0 || nx >= n || ny < 0 || ny >= n || a[nx][ny] == 0) continue;
      if (clr[nx][ny] == -1) {
        clr[nx][ny] = c;
        queuex[r] = nx, queuey[r] = ny, ++r;
      }
    }
  }
}
double qdist(double x1, double y1, double x2, double y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) scanf("%d", &a[i][j]);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      cool[i][j] = false;
      for (int k = 0; k < 4; k++) {
        int x = i + cx[k], y = j + cy[k];
        if (x < 0 || x >= n || y < 0 || y >= n) continue;
        if (a[x][y] == 0) cool[i][j] = true;
      }
    }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) dist[i][j] = inf;
  int l = 0, r = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1 && cool[i][j])
        queuex[r] = i, queuey[r] = j, ++r, dist[i][j] = 0;
  while (r > l) {
    int x = queuex[l], y = queuey[l];
    ++l;
    for (int i = 0; i < 4; i++) {
      int nx = x + cx[i], ny = y + cy[i];
      if (nx < 0 || nx >= n || ny < 0 || ny >= n || a[nx][ny] == 0) continue;
      if (dist[nx][ny] > dist[x][y] + 1) {
        dist[nx][ny] = dist[x][y] + 1;
        queuex[r] = nx, queuey[r] = ny, ++r;
      }
    }
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) clr[i][j] = -1;
  int cnt = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1 && clr[i][j] == -1) bfs(i, j, cnt++);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1) bx[clr[i][j]] = i, by[clr[i][j]] = j;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1 && dist[i][j] > dist[bx[clr[i][j]]][by[clr[i][j]]])
        bx[clr[i][j]] = i, by[clr[i][j]] = j;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1) {
        ++ctot[clr[i][j]];
        if (qdist(bx[clr[i][j]], by[clr[i][j]], i, j) <=
            dist[bx[clr[i][j]]][by[clr[i][j]]])
          ++cnf[clr[i][j]];
      }
  int a = 0, b = 0;
  for (int i = 0; i < cnt; i++) {
    if (abs(ctot[i] - cnf[i]) < 1)
      ++a;
    else
      ++b;
  }
  cout << a << ' ' << b << '\n';
  return 0;
}
