Problem:
Score : 400 points

Problem Statement

You are given N integers; the i-th of them is A_i.
Find the maximum possible sum of the absolute differences between the adjacent elements after arranging these integers in a row in any order you like.

Constraints

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

Print the maximum possible sum of the absolute differences between the adjacent elements after arranging the given integers in a row in any order you like.

Sample Input 1

5
6
8
1
2
3

Sample Output 1

21

When the integers are arranged as 3,8,1,6,2, the sum of the absolute differences between the adjacent elements is |3 - 8| + |8 - 1| + |1 - 6| + |6 - 2| = 21. This is the maximum possible sum.

Sample Input 2

6
3
1
4
1
5
9

Sample Output 2

25

Sample Input 3

3
5
5
1

Sample Output 3

8

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

// デバッグ実行：Ctrl+F5

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        String line;
        line = Console.ReadLine();
        int N = int.Parse(line);
        List<int> A = new List<int>();
        for (int i = 0; i < N; i++)
        {
            line = Console.ReadLine();
            A.Add(int.Parse(line));
        }
        A.Sort();

        long result = 0;
        if (N % 2 == 0)
        {
            // 偶数の場合
            result += A[N / 2];
            for(int i = N / 2 + 1; i < N; i++)
            {
                result += A[i] * 2;
            }
            result -= A[N / 2 - 1];
            for (int i = 0; i < N / 2 - 1; i++)
            {
                result -= A[i] * 2;
            }
        }
        else
        {
            // 奇数の場合
            // 高いものを端っこに並べる場合
            long result_high = 0;
            result_high += A[(N - 1) / 2];
            result_high += A[(N + 1) / 2];
            for (int i = (N+1) / 2 + 1; i < N; i++)
            {
                result_high += A[i] * 2;
            }
            for (int i = 0; i < (N - 1) / 2; i++)
            {
                result_high -= A[i] * 2;
            }
            // 低いものを端っこに並べる場合
            long result_low = 0;
            result_low -= A[(N - 1) / 2];
            result_low -= A[(N - 3) / 2];
            for (int i = (N - 1) / 2 + 1; i < N; i++)
            {
                result_low += A[i] * 2;
            }
            for (int i = 0; i < (N - 3) / 2; i++)
            {
                result_low -= A[i] * 2;
            }
            if (result_low < result_high) result = result_high;
            else result = result_low;
        }

        Console.WriteLine(result);
    }
}