Problem:
Score : 800 points

Problem Statement

There are N positive integers A_1, A_2, ..., A_N.
Takahashi can perform the following operation on these integers any number of times:

Choose 1 \leq i \leq N and multiply the value of A_i by -2.

Notice that he multiplies it by minus two.

He would like to make A_1 \leq A_2 \leq ... \leq A_N holds.
Find the minimum number of operations required. If it is impossible, print -1.

Constraints

1 \leq N \leq 200000

1 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the answer.

Sample Input 1

4
3 1 4 1

Sample Output 1

3

One possible solution is:

Choose i=4 and multiply the value of A_4 by -2. A_1, A_2, A_3, A_4 are now 3, 1, 4, -2.

Choose i=1 and multiply the value of A_1 by -2. A_1, A_2, A_3, A_4 are now -6, 1, 4, -2.

Choose i=4 and multiply the value of A_4 by -2. A_1, A_2, A_3, A_4 are now -6, 1, 4, 4.

Sample Input 2

5
1 2 3 4 5

Sample Output 2

0

A_1 \leq A_2 \leq ... \leq A_N holds before any operation is performed.

Sample Input 3

8
657312726 129662684 181537270 324043958 468214806 916875077 825989291 319670097

Sample Output 3

7

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

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		int N = int.Parse(Console.ReadLine());
		string[] str = Console.ReadLine().Split();
		long[]A = new long[N];
		for(var i=0;i<N;i++){
			A[i] = long.Parse(str[i]);
		}
		long[,]D = new long[N,16];
		for(var i=0;i<16;i++){
			D[N-1,i] = i;
		}
		for(var i=N-2;i>=0;i--){
			long x1 = A[i];
			long x2 = A[i+1];
			if(x1<x2){
				long ct = 0;
				while(x1<x2){
					x1 *= 4;
					ct++;
				}
				for(var j=0;j<=ct-1;j++){
					D[i,j] = D[i+1,0]+j;
				}
              	if(x1>x2){
                	for(var j=ct;j<16;j++){
                      D[i,j] = D[i+1,j-ct+1]+j;
                    }
                } else {
                  	D[i,ct] = D[i+1,0]+ct;
                    for(var j=ct+1;j<16;j++){
                      D[i,j] = D[i+1,j-ct+1]+j;
                    }
                }
			} else {
				long ct = 0;
				while(x1>x2){
					x2 *= 4;
					ct++;
				}
				for(var j=0;j<16;j++){
					if(j+ct<16){
						D[i,j] = D[i+1,j+ct]+j;
					} else {
						D[i,j] = D[i+1,15]+j+(j+ct-15)*(N-i-1);
					}
				}
            }
		}
		Array.Reverse(A);
		long[,]E = new long[N,16];
		for(var ia=0;ia<16;ia++){
			E[N-1,ia] = ia;
		}
		for(var ia=N-2;ia>=0;ia--){
			long x1 = A[ia];
			long x2 = A[ia+1];
			if(x1<x2){
				long ct = 0;
				while(x1<x2){
					x1 *= 4;
					ct++;
				}
				for(var j=0;j<=ct-1;j++){
					E[ia,j] = E[ia+1,0]+j;
				}
              	if(x1>x2){
                	for(var j=ct;j<16;j++){
                      E[ia,j] = E[ia+1,j-ct+1]+j;
                    }
                } else {
                  	E[ia,ct] = E[ia+1,0]+ct;
                    for(var j=ct+1;j<16;j++){
                      E[ia,j] = E[ia+1,j-ct+1]+j;
                    }
                }
			} else {
				long ct = 0;
				while(x1>x2){
					x2 *= 4;
					ct++;
				}
				for(var j=0;j<16;j++){
					if(j+ct<16){
						E[ia,j] = E[ia+1,j+ct]+j;
					} else {
						E[ia,j] = E[ia+1,15]+j+(j+ct-15)*(N-ia-1);
					}
                }
			}
		}
		long min = D[0,0]*2;
		for(var ib=1;ib<N-1;ib++){
			long ans = D[ib,0]*2 + E[N-ib-1,0]*2 + ib;
			min = Math.Min(ans,min);
		}
		min=Math.Min(min,E[0,0]*2+N-1);
		Console.WriteLine(min);
      	for(var i=0;i<N;i++){
          for(var j=0;j<16;j++){
            //Console.Write(D[i,j]+" ");
          }
          //Console.WriteLine();
        }
		for(var i=0;i<N;i++){
          for(var j=0;j<16;j++){
           //Console.Write(E[i,j]+" ");
          }
          //Console.WriteLine();
        }
	}
}