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)

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program
{
    const string Yes = "Yes";
    const string No = "No";
    const char White = '.';
    const char Black = '#';
    const long Mod = 1000000007;

    static void Main(string[] args) {
#if DEBUG
        MyDebugger.Test(process, "../TextFile1.txt");
#else
        object ret = process(new StreamReader(Console.OpenStandardInput()));
        Console.WriteLine(ret);
#endif
    }

    static object process(TextReader input) {
        var n = int.Parse(input.ReadLine());
        var aa = new int[n];
        for(int i=0; i<n; i++) {
            aa[i] = int.Parse(input.ReadLine());
        }

        Array.Sort(aa);

        Func<int, int ,long> sum = (s, e) => {
            long y = 0;
            for(int i=s; i<=e; i++) y+= aa[i];
            return y;
        };


        if(n % 2 == 0) {
            int ss = 0;
            int se = n/2 -1;
            int bs = n/2;
            int be = n-1;

            long y = -2 * sum(ss, se) + 2 * sum(bs, be);
            long y1 = y + aa[se] - aa[bs];
            return y1;
        } else {
            int ss = 0;
            int se = n / 2;
            int bs = n / 2 + 1;
            int be = n - 1;

            long y = -2 * sum(ss, se) + 2 * sum(bs, be);
            long y1 = y + aa[se] + aa[se - 1];

            ss = 0;
            se = n / 2 - 1;
            bs = n / 2;
            be = n - 1;

            long z = -2 * sum(ss, se) + 2 * sum(bs, be);
            long z1 = z - aa[bs] - aa[bs + 1];

            return Math.Max(y1, z1);
        }
    }

    static int[] ToIntArray(string strs, int n) {
        var ret = new int[n];
        var spl = strs.Split(' ');
        for (int i = 0; i < n; i++)
            ret[i] = int.Parse(spl[i]);
        return ret;
    }
}