#include <bits/stdc++.h>
using namespace std;
stack<time_t> time_stack;
void startTimer() { time_stack.push(clock()); }
double stopTimer() {
  double time = clock() - time_stack.top();
  time_stack.pop();
  return time / double(CLOCKS_PER_SEC);
}
double sqr(double x) { return x * x; }
int main() {
  startTimer();
  ios::sync_with_stdio(false);
  string TASK = "immediate";
  cout.precision(9);
  cout << fixed;
  int n;
  cin >> n;
  pair<int, vector<int> > ans(0, vector<int>(2 * n));
  vector<pair<int, int> > stream(2 * n);
  for (int i = 0; i < 2 * n; i++) {
    cin >> stream[i].first;
    stream[i].second = i;
  }
  for (int t = 0; t < 10000; t++) {
    random_shuffle(stream.begin(), stream.end());
    map<int, int> m1, m2;
    for (int i = 0; i < 2 * n; i++) {
      int a = stream[i].first, pos = stream[i].second;
      if (m1.find(a) != m1.end())
        m2.emplace(a, pos);
      else if (m2.find(a) != m2.end())
        m1.emplace(a, pos);
      else if (m1.size() < m2.size())
        m1.emplace(a, pos);
      else
        m2.emplace(a, pos);
    }
    while (m1.size() > 1 + m2.size()) {
      auto it = m1.begin();
      m2.insert(*it);
      m1.erase(it);
    }
    while (m2.size() > m1.size() + 1) {
      auto it = m2.begin();
      m2.erase(it);
    }
    int cnt = int(m1.size()) * int(m2.size());
    vector<int> a(2 * n);
    for (auto it : m1) a[it.second] = 1;
    for (auto it : m2) a[it.second] = 2;
    int cnt1 = m1.size(), cnt2 = m2.size();
    for (int i = 0; i < 2 * n; i++)
      if (a[i] == 0)
        if (cnt1 < cnt2) {
          a[i] = 1;
          cnt1++;
        } else {
          a[i] = 2;
          cnt2++;
        }
    if (cnt > ans.first) {
      ans.first = cnt;
      ans.second = a;
    }
  }
  cout << ans.first << endl;
  for (auto it : ans.second) cout << it + int(it == 0) << " ";
  cout << endl;
  return 0;
}
