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 asc(const void *a, const void *b){
  return *(int *)a - *(int *)b;
}

int
main(int argc, char *argv[])
{
  int n, u[50001], v[50001];;
  scanf("%d", &n);
  for(int i = 0; i < n/2; i++) scanf("%d %d", &u[i], &v[i]);

  qsort(u, n/2, sizeof(int), asc);
  qsort(v, n/2, sizeof(int), asc);

  int k  = 0; int u_flag[50000]; u_flag[0] = 1;
  int us[50000]; us[0] = u[0];
  for(int i = 1; i < n/2; i++){
    if(u[i - 1] != u[i]){
      k++;
      us[k] = u[i];
    }
    u_flag[k]++;
  }
  for(int i = 0; i <= k; i++){
    printf("%d %d\n", u_flag[i], us[i]);
  }

  int l = 0; int v_flag[50000]; v_flag[0] = 1;
  int vs[50000]; vs[0] = v[0];
  for(int i = 1; i < n/2; i++){
    if(v[i - 1] != v[i]){
      l++;
      vs[l] = v[i];
    }
    v_flag[l]++;
  }
  for(int i = 0; i <= l; i++){
    printf("%d %d\n", v_flag[i], vs[i]);
  }

  int ufirst = 0, usecond = 0; int x;
  for(int i = 0; i <= k; i++){
    if(u_flag[i] > ufirst){
      ufirst = u_flag[i];
      x = us[i];
    }
    else if(u_flag[i] > usecond){
      usecond = u_flag[i];
    }
  }

  int vfirst = 0, vsecond = 0, y; 
  for(int i = 0; i <= l; i++){
    if(v_flag[i] > vfirst){
      vfirst = v_flag[i];
      y = vs[i];
    }
    else if(v_flag[i] > vsecond){
      vsecond = v_flag[i];
    }
  }

  int ans;
  if(x == y){
    int ans1 = n - ufirst - vsecond;
    int ans2 = n - vfirst - usecond;
    ans = (ans2 < ans1 ? ans2 : ans1);
  }
  else ans = n - vfirst -ufirst;

  printf("%d\n", ans);

  return 0;
}