Problem:
Score : 300 points

Problem Statement

A sequence a_1,a_2,... ,a_n is said to be /\/\/\/ when the following conditions are satisfied:

For each i = 1,2,..., n-2, a_i = a_{i+2}.

Exactly two different numbers appear in the sequence.

You are given a sequence v_1,v_2,...,v_n whose length is even.
We would like to make this sequence /\/\/\/ by replacing some of its elements.
Find the minimum number of elements that needs to be replaced.

Constraints

2 \leq n \leq 10^5

n is even.

1 \leq v_i \leq 10^5

v_i is an integer.

Input

Input is given from Standard Input in the following format:

n
v_1 v_2 ... v_n

Output

Print the minimum number of elements that needs to be replaced.

Sample Input 1

4
3 1 3 2

Sample Output 1

1

The sequence 3,1,3,2 is not /\/\/\/, but we can make it /\/\/\/ by replacing one of its elements: for example, replace the fourth element to make it 3,1,3,1.

Sample Input 2

6
105 119 105 119 105 119

Sample Output 2

0

The sequence 105,119,105,119,105,119 is /\/\/\/.

Sample Input 3

4
1 1 1 1

Sample Output 3

2

The elements of the sequence 1,1,1,1 are all the same, so it is not /\/\/\/.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>

using namespace std;

#define debug(n) cerr << #n << ':' << n << endl;
#define dline    cerr << __LINE__ << endl;
#define rep(i,s,e) for(int i = (int)(s); i < (int)(e); ++i)
#define per(i,s,e) for(int i = (int)(s)-1; i >= (int)(e); --i)

using ll = long long;
template<class T, class U> using P = pair<T,U>;
template<class T> using Heap = priority_queue<T>;
template<class T> using heaP = priority_queue<T,vector<T>,greater<T>>;

template<class T>
bool ChangeMax(T&a,const T&b){
  if(a >= b) return false;
  a = b;    return true;
}

template<class T>
bool ChangeMin(T&a,const T&b){
  if(a <= b) return false;
  a = b;    return true;  
}

template<class T, size_t N, class U>
void Fill(T (&a)[N], const U&v){
    fill((U*)a,(U*)(a+N),v);
}

template<class T>
istream& operator >> (istream&is, vector<T>&v){
  for(auto&e:v)is >> e;
  return is;
}

int main(){
  int n;cin >> n;
  vector<int> a(100001,0),b(100001,0);
  bool eq = true;
  rep(i,0,n){
    int x=0;int p = x;
    cin >> x;
    if(i&&p!=x)eq=false;
    if(i%2)b[x]++;
    else a[x]++;
    debug(x);
    debug(a[x]);
    debug(b[x]);
  }
  if(eq){cout << n/2 << endl; return 0;}
  int amax=0, bmax=0,ai,bi;
  rep(i,0,100001){    
    if(ChangeMax(bmax,b[i]))bi=i;
    if(ChangeMax(amax,a[i]))ai=i;
  }
  int asec=0,bsec=0,asi,bsi;
  rep(i,0,100001){
    if(bi!=i&&ChangeMax(bsec,b[i]))bsi=i;
    if(ai!=i&&ChangeMax(asec,a[i]))asi=i;
  }
  debug(amax);
  debug(bmax);
  debug(asec);
  debug(bsec);
  debug(ai);
  debug(bi);
  debug(asi);
  debug(bsi);
  if(ai==bi){
    if(amax+bsec>bmax+asec)tie(bmax,bi)=tie(bsec,bsi);
    else tie(amax,ai) = tie(asec,asi);
  }
  cout << max(n/2-amax,n/2-bmax) << endl;
  return 0;
}