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.Generic;
using System.Linq;
using static System.Console;
using static MyUtil;

class MyUtil
{
    public static void Swap<T>(ref T a, ref T b)
    {
	var t = a;
	a = b;
	b = t;
    }

    public static int[] ReadIntArray()
    {
	return ReadLine().Split().Select(x => int.Parse(x)).ToArray();
    }

    public static long[] ReadLongArray()
    {
	return ReadLine().Split().Select(x => long.Parse(x)).ToArray();
    }
}

class Program
{
    public static void Main()
    {
	int n = int.Parse(ReadLine());
	var vs = ReadIntArray();

	var h0 = new Dictionary<int, int>();
	var h1 = new Dictionary<int, int>();

	for(int i = 0; i < n; i += 2)
	{
	    int v0 = vs[i];
	    if (!h0.ContainsKey(v0)){ h0[v0] = 0; }
	    h0[v0] += 1;

	    int v1 = vs[i + 1];
	    if (!h1.ContainsKey(v1)){ h1[v1] = 0; }
	    h1[v1] += 1;
	}

	int mfv0 = 0, mfv1 = 0; // most frequent values
	int maxf0 = 0, secondf0 = 0, maxf1 = 0, secondf1 = 0;
	
	foreach (int v0 in h0.Keys)
	{
	    int f = h0[v0];
	    if (f > maxf0){
		secondf0 = maxf0;
		mfv0 = v0;
		maxf0 = f;
	    }
	    else if (f > secondf0)
	    {
		secondf0 = f;
	    }
	}

	foreach (int v1 in h1.Keys)
	{
	    int f = h1[v1];
	    if (f > maxf1)
	    {
		secondf1 = maxf1;
		mfv1 = v1;
		maxf1 = f;
	    }
	    else if (f > secondf1)
	    {
		secondf1 = f;
	    }
	}

	int ans;
	
	if (mfv0 != mfv1)
	{
	    ans = n - maxf0 - maxf1;
	}
	else
	{
	    int ans0 = n - maxf0 - secondf1;
	    int ans1 = n - maxf1 - secondf0;
	    ans = Math.Min(ans0, ans1);
	}
    
	WriteLine(ans);
    }
}