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 Go (1.6) (judge verdict: Accepted)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var sc, wr = bufio.NewScanner(os.Stdin), bufio.NewWriter(os.Stdout)

func scanString() string   { sc.Scan(); return sc.Text() }
func scanRunes() []rune    { return []rune(scanString()) }
func scanInt() int         { a, _ := strconv.Atoi(scanString()); return a }
func scanInt64() int64     { a, _ := strconv.ParseInt(scanString(), 10, 64); return a }
func scanFloat64() float64 { a, _ := strconv.ParseFloat(scanString(), 64); return a }

func scanInts(n int) []int {
	res := make([]int, n)
	for i := 0; i < n; i++ {
		res[i] = scanInt()
	}
	return res
}

func debug(a ...interface{}) { fmt.Fprintln(os.Stderr, a...) }

func abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}
func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

//•*¨*•.¸¸♪main•*¨*•.¸¸♪(　-ω-)ノ　(　・ω・)
func main() {
	defer wr.Flush()
	sc.Split(bufio.ScanWords)
	sc.Buffer(make([]byte, 10000), 1001001)

	n := scanInt()
	v := scanInts(n)
	cnt0 := map[int]int{}
	cnt1 := map[int]int{}
	for i := 0; i < n; i++ {
		if i&1 == 0 {
			cnt0[v[i]]++
		} else {
			cnt1[v[i]]++
		}
	}

	ma := [2][2]int{}
	memo := [2][2]int{}
	for v, e := range cnt0 {
		if ma[0][0] < e {
			ma[0][1] = ma[0][0]
			memo[0][1] = memo[0][0]
			ma[0][0] = e
			memo[0][0] = v
		} else if ma[0][1] < e {
			ma[0][1] = e
			memo[0][1] = v
		}
	}
	for v, e := range cnt1 {
		if ma[1][0] < e {
			ma[1][1] = ma[1][0]
			memo[1][1] = memo[1][0]
			ma[1][0] = e
			memo[1][0] = v
		} else if ma[1][1] < e {
			ma[1][1] = e
			memo[1][1] = v
		}
	}

	ans := n
	if memo[0][0] == memo[1][0] {
		if ma[0][0] > ma[1][0] || (ma[0][0] == ma[1][0] && ma[0][1] < ma[1][1]) {
			ans -= ma[0][0] + ma[1][1]
		} else {
			ans -= ma[0][1] + ma[1][0]
		}
	} else {
		ans -= ma[0][0] + ma[1][0]
	}
	fmt.Fprintln(wr, ans)
}