Problem:
Score : 300 points

Problem Statement

Snuke has an integer sequence A of length N.

He will freely choose an integer b.
Here, he will get sad if A_i and b+i are far from each other.
More specifically, the sadness of Snuke is calculated as follows:

abs(A_1 - (b+1)) + abs(A_2 - (b+2)) + ... + abs(A_N - (b+N))

Here, abs(x) is a function that returns the absolute value of x.

Find the minimum possible sadness of Snuke.

Constraints

1 \leq N \leq 2 \times 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_2 ... A_N

Output

Print the minimum possible sadness of Snuke.

Sample Input 1

5
2 2 3 5 5

Sample Output 1

2

If we choose b=0, the sadness of Snuke would be abs(2-(0+1))+abs(2-(0+2))+abs(3-(0+3))+abs(5-(0+4))+abs(5-(0+5))=2.
Any choice of b does not make the sadness of Snuke less than 2, so the answer is 2.

Sample Input 2

9
1 2 3 4 5 6 7 8 9

Sample Output 2

0

Sample Input 3

6
6 5 4 3 2 1

Sample Output 3

18

Sample Input 4

7
1 1 1 1 2 3 4

Sample Output 4

6

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void merge(long *a, int left, int middle, int right)
{
	int i, j, k, nb;
	long *b;

	i = left;
	j = middle + 1;
	k = 0;

	nb = right - left + 1;
	if ((b = (long *)malloc(sizeof(long)*nb)) == NULL) {
		fprintf(stderr, "MEM malloc error...\n");
		return;
	}

	while (i <= middle && j <= right) {
		if (a[i] <= a[j]) {
			b[k] = a[i];
			i++;
		}
		else {
			b[k] = a[j];
			j++;
		}
		k++;
	}

	if (i == middle + 1) {
		while (j <= right) {
			b[k] = a[j];
			j++;
			k++;
		}
	}
	else {
		while (i <= middle) {
			b[k] = a[i];
			i++;
			k++;
		}
	}

	for (i = 0; i<k; i++)
		a[left + i] = b[i];

}

void merge_sort(long *a, int left, int right)
{
	int middle;

	if (left == right) return;

	middle = (right + left) / 2;

	merge_sort(a, left, middle);
	merge_sort(a, middle + 1, right);
	merge(a, left, middle, right);

}

int main()
{
	int n, i, m , b , ans=0 , t=0,u=0;
	long  *a, *x;

	scanf("%d", &n);

	a =x= (long *)malloc(n * sizeof(long));

	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);

	for (i = 0; i < n; i++)
		x[i] = a[i] - (i + 1);

	merge_sort(x, 0, n - 1);

	if (n % 2) {
		m = n / 2;
		b = x[m];
		for (i = 0; i < n; i++) {
			ans += abs(x[i] - b);
		}
	}
	else {
		m = n / 2;
		b = x[m];
		for (i = 0; i < n; i++) {
			t += abs(x[i] - b);
		}
		b = x[m-1] ;
		for (i = 0; i < n; i++) {
			u += abs(x[i] - b);
		}
		if (t >= u) ans = u; else ans = t;
	}

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


}