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 Pascal (FPC 2.6.2) (judge verdict: Runtime Error)

var
  a,c:array[1..100000]of longint;
  b:array[1..100000]of boolean;
  i,n,s,j,x,y,sum1,sum2:longint;
procedure qsort(l,r:longint);
var
  i,j,mid,p:longint;
begin
  i:=l;j:=r;
  mid:=a[(l+r) div 2];
  repeat
    while a[i]<mid do inc(i);
    while a[j]>mid do dec(j);
    if i<=j then
      begin
        p:=a[i];a[i]:=a[j];a[j]:=p;
        inc(i);
        dec(j);
      end;
  until i>j;
  if l<j then qsort(l,j);
  if i<r then qsort(i,r);
end;
begin
  readln(n);
  for i:=1 to n do read(a[i]);
  if n=2 then begin write(abs(a[1]-a[2]));halt;end;
  qsort(1,n);
  fillchar(b,sizeof(b),true);
  i:=2;j:=n-2;
  if odd(n) then 
              begin 
			    c[n div 2+1]:=a[1];
				c[n div 2]:=a[n];
				c[n div 2+2]:=a[n-1];
				s:=3;
				x:=n div 2-1;
				y:=n div 2+3;
			  end
			else 
			  begin 
			    c[n div 2]:=a[1];
				c[n div 2-1]:=a[n];
				c[n div 2+1]:=a[n-1];
				s:=3;
				x:=n div 2-2;
				y:=n div 2+2;
			  end;
  while (x>=1) and (y<=n) do
  begin
  if (s mod 4=3)and(i<=n) then 
  begin
    c[x]:=a[i];inc(i);inc(y);
	c[y]:=a[i];inc(i);dec(x);
	s:=s+2;
  end;
  if (s mod 4=1)and(j>=1) then 
  begin
    c[x]:=a[j];dec(j);dec(x);
	c[y]:=a[j];dec(j);inc(y);
	s:=s+2;
  end;
  end;
  if odd(x) then c[n]:=a[n div 2+1] else c[x]:=a[n div 2];
  for i:=2 to n do sum1:=sum1+abs(c[i]-c[i-1]);
  i:=2;j:=n-2;
  if odd(n) then 
              begin 
			    c[n div 2+1]:=a[1];
				c[n div 2]:=a[n];
				c[n div 2+2]:=a[n-1];
				s:=3;
				x:=n div 2-1;
				y:=n div 2+3;
			  end
			else 
			  begin 
			    c[n div 2]:=a[1];
				c[n div 2-1]:=a[n];
				c[n div 2+1]:=a[n-1];
				s:=3;
				x:=n div 2-2;
				y:=n div 2+2;
			  end;
  while (x>=1) and (y<=n) do
  begin
  if (s mod 4=3)and(i<=n) then 
  begin
    c[y]:=a[i];inc(i);inc(y);
	c[x]:=a[i];inc(i);dec(x);
	s:=s+2;
  end;
  if (s mod 4=1)and(j>=1) then 
  begin
    c[y]:=a[j];dec(j);dec(x);
	c[x]:=a[j];dec(j);inc(y);
	s:=s+2;
  end;
  end;
  if odd(x) then c[n]:=a[n div 2+1] else c[x]:=a[n div 2];
  for i:=2 to n do sum2:=sum2+abs(c[i]-c[i-1]);
  if sum1>sum2 then write(sum1) else write(sum2);
  readln(i);
end.