题目传送门
思路
这题我们把序列当做一个环,我们分类讨论两种操作。
第一种操作不会改变数列的顺序,第二种操作改变元素的正反。
那么我们要找到一个点,使它可以通过移位或反转成为一个有序序列。
如果不能通过操作成为有序序列,直接输出 − 1 -1 −1。
否则我们需要找到这个点,然后判断最小值。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,n;
int a[100005];
void solve(){
cin>>n;
int m=0,l=0,idm=0,idl=0,ans=1e9;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
if(a[i]>a[i+1]){
l++;
idm=i+1;
}else if(a[i]<a[i+1]){
m++;
idl=i+1;
}
}
if(l==0){
cout<<0<<endl;
}else if(m==0){
cout<<1<<endl;
}else if(l>1&&m>1){
cout<<-1<<endl;
}else{
if(l==1&&a[1]>=a[n]){
ans=min(ans,min(idm+1,n-idm+1));
}
if(m==1&&a[1]<=a[n]){
ans=min(ans,min(idl,n-idl+2));
}
cout<<(ans==1e9?-1:ans)<<endl;
}
}
signed main(){
cin>>t;
while(t--){
solve();
}
return 0;
}