#include #include #include #include using namespace std; long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ assert(cnt>0); if(is_neg){ x= -x; } assert(l<=x && x<=r); return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } int T; int n; int arr[100100]; int dp[100100][2]; bool compare(int a,int b,bool n){ if(n){ return ab; } int f(int i){ return n-i+1; } int solve_even(int is_bigger){ for(int i=1;i<=n;i++){ dp[i][0]=dp[i][1]=0; } dp[n/2 + 1][0] = 1<<20; dp[n/2 + 1][1] = 1<<20; if(!is_bigger){ if(arr[n/2 ] < arr[n/2 + 1]){ dp[n/2 + 1][0] = 0; } if(arr[n/2 ] > arr[n/2 + 1]){ dp[n/2 + 1][1] = 1; } } else { if(arr[n/2 ] > arr[n/2 + 1]){ dp[n/2 + 1][0] = 0; } if(arr[n/2 ] < arr[n/2 + 1]){ dp[n/2 + 1][1] = 1; } } for(int i=n/2+2;i<=n;i++){ dp[i][0]= 1<<20; dp[i][1]= 1<<20; if(compare(arr[i-1],arr[i],is_bigger) && compare(arr[f(i)],arr[f(i-1)],is_bigger)){ dp[i][0]=min(dp[i][0],dp[i-1][0]); } if(compare(arr[f(i-1)],arr[i],is_bigger) && compare(arr[f(i)],arr[i-1],is_bigger)){ dp[i][0]=min(dp[i][0],dp[i-1][1]); } if(compare(arr[i-1],arr[f(i)],is_bigger) && compare(arr[i],arr[f(i-1)],is_bigger)){ dp[i][1]=min(dp[i][1],dp[i-1][0]+1); } if(compare(arr[f(i-1)],arr[f(i)],is_bigger) && compare(arr[i],arr[i-1],is_bigger)){ dp[i][1]=min(dp[i][1],dp[i-1][1]+1); } is_bigger = !is_bigger; } int ans =min(dp[n][0],dp[n][1]); return ans; } int solve_odd(bool is_bigger){ for(int i=1;i<=n;i++){ dp[i][0]=dp[i][1]=0; } dp[n/2+1][1]=1<<20; for(int i=n/2+2;i<=n;i++){ dp[i][0]= 1<<20; dp[i][1]= 1<<20; if(compare(arr[i-1],arr[i],!is_bigger) && compare(arr[f(i)],arr[f(i-1)],is_bigger)){ dp[i][0]=min(dp[i][0],dp[i-1][0]); } if(compare(arr[f(i-1)],arr[i],!is_bigger) && compare(arr[f(i)],arr[i-1],is_bigger)){ dp[i][0]=min(dp[i][0],dp[i-1][1]); } if(compare(arr[i-1],arr[f(i)],!is_bigger) && compare(arr[i],arr[f(i-1)],is_bigger)){ dp[i][1]=min(dp[i][1],dp[i-1][0]+1); } if(compare(arr[f(i-1)],arr[f(i)],!is_bigger) && compare(arr[i],arr[i-1],is_bigger)){ dp[i][1]=min(dp[i][1],dp[i-1][1]+1); } is_bigger = !is_bigger; } int ans =min(dp[n][0],dp[n][1]); return ans; } int main(){ //freopen("in0.txt","r",stdin); //n=readIntLn(1,100000); cin.sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ if(i==n){ //arr[i] = readIntLn(1,1000000000); } else { //arr[i] = readIntSp(1,1000000000); } cin>>arr[i]; } int ans; if(n % 2==0){ ans = solve_even(true); ans = min(ans,solve_even(false)); } else { ans = solve_odd(true); ans = min(ans,solve_odd(false)); } if(ans == 1<<20){ cout<<-1<