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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
 
int cmp( const void *p, const void *q ) {
    return (int*)p - (int*)q;
}
 
int main(void){
	
	int i, n, tmp, cnt, ans, odd1 = 0, odd2 = 0, even1 = 0, even2 = 0, cnt_odd1 = 0, cnt_odd2 = 0, cnt_even1 = 0, cnt_even2 = 0;
	
	scanf("%d", &n);
	
	int v_odd[n / 2], v_even[n / 2];
	
	for(i = 0; i < n; i++){
		if(i % 2 == 0){
			scanf("%d", &v_even[i / 2]);
		}else{
			scanf("%d", &v_odd[i / 2]);
		}
	}
	
	qsort(v_even, n / 2, sizeof(int), cmp);
	qsort(v_odd, n / 2, sizeof(int), cmp);
	
	tmp = v_odd[0];
	cnt = 1;
	i = 1;
	while(i < n / 2){
		if(tmp == v_odd[i]){
			cnt++;
		}else{
			if(cnt >= cnt_odd1){
				cnt_odd2 = cnt_odd1;
				odd2 = odd1;
				cnt_odd1 = cnt;
				odd1 = tmp;
			}else if(cnt >= cnt_odd2){
				cnt_odd2 = cnt;
				odd2 = tmp;
			}
			cnt = 1;
			tmp = v_odd[i];
		}
		i++;
	}
	if(cnt >= cnt_odd1){
		cnt_odd2 = cnt_odd1;
		odd2 = odd1;
		cnt_odd1 = cnt;
		odd1 = tmp;
	}else if(cnt >= cnt_odd2){
		cnt_odd2 = cnt;
		odd2 = tmp;
	}
	
	tmp = v_even[0];
	cnt = 1;
	i = 1;
	while(i < n / 2){
		if(tmp == v_even[i]){
			cnt++;
		}else{
			if(cnt >= cnt_even1){
				cnt_even2 = cnt_even1;
				even2 = even1;
				cnt_even1 = cnt;
				even1 = tmp;
			}else if(cnt >= cnt_even2){
				cnt_even2 = cnt;
				even2 = tmp;
			}
			cnt = 1;
			tmp = v_even[i];
		}
		i++;
	}
	if(cnt >= cnt_even1){
		cnt_even2 = cnt_even1;
		even2 = even1;
		cnt_even1 = cnt;
		even1 = tmp;
	}else if(cnt >= cnt_even2){
		cnt_even2 = cnt;
		even2 = tmp;
	}
	
	// printf("odd1 : %d (%d)\nodd2 : %d (%d)\neven1 : %d (%d)\neven2 : %d (%d)\n", odd1, cnt_odd1, odd2, cnt_odd2, even1, cnt_even1, even2, cnt_even2);
	
	if(odd1 == even1){
		int a[2];
		a[0] = (n / 2 - cnt_odd2) + (n / 2 - cnt_even1);
		a[1] = (n / 2 - cnt_odd1) + (n / 2 - cnt_even2);
		if(a[0] < a[1]){
			ans = a[0];
		}else{
			ans = a[1];
		}
	}else{
		ans = (n / 2 - cnt_odd1) + (n / 2 - cnt_even1);
	}
	
	printf("%d", ans);
	
	
	return 0;
}