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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		var di = new Dictionary<int,int>[2];
		for(int i=0;i<2;i++) di[i] = new Dictionary<int,int>();
		for(int i=0;i<N;i++){
			if(!di[i % 2].ContainsKey(A[i])) di[i % 2].Add(A[i], 0);
			di[i % 2][A[i]]++;
		}
		
		var l0 = di[0].Keys.ToList();
		var l1 = di[1].Keys.ToList();
		
		l0.Sort((a, b) => - (di[0][a].CompareTo(di[0][b])));
		l1.Sort((a, b) => - (di[1][a].CompareTo(di[1][b])));
		
		
		if(l0.Count == 1 && l1.Count == 1){
			if(l0[0] == l1[0]){
				Console.WriteLine(N / 2);
			} else {
				Console.WriteLine(0);
			}
			return;
		}
		
		int min = (int) 1e9;
		for(int i=0;i<Math.Min(2, l0.Count);i++){
			for(int j=0;j<Math.Min(2, l1.Count); j++){
				if(l0[i] == l1[j]) continue;
				int c0 = N / 2 - di[0][l0[i]];
				int c1 = N / 2 - di[1][l1[j]];
				min = Math.Min(min, c0 + c1);
			}
		}
		
		Console.WriteLine(min);
	}
	int N;
	int[] A;
	public Sol(){
		N = ri();
		A = ria();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}