题意:
长度为n的排列,可执行一下操作任意次:
排列中选择两个数,小值移动到当前排列的最前面,大值移动到当前排列的最后面
问最少需要多少次可使排列变成有序增排列
思路:
可以发现一个排列最多经过n/2 次操作一定可以有序.假设经过k次操作排列变成有序,第一次操作一定是选择(k,n-k+1),最后一次选择(1,n),且排列中 k~n-k+1(开区间)一定是有序的。所以我们可以从k的最大值开始,不断减小。当条件不满足时说明这就是最小操作步数.....不知道怎么表达,不太清晰...
#include<bits/stdc++.h>
#define int long long
#define pdd pair<double,double>
#define pii pair<int,int>
// #define x first
// #define y second
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int N=2e5+10;
const int inf=0x3f3f3f3f;
int n;
int a[N];
int pos[N];
void solve(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
pos[a[i]]=i;
}
int l=(n+1)/2,r=(n+2)/2;
while(l>0 && ((pos[l]<pos[l+1] && pos[r]>pos[r-1]) || l==r ) ){
l--;
r++;
}
cout << (n-r+l+1)/2 << endl;
}
signed main(){
ios;
int t=1;
cin >> t;
while(t--){
solve();
}
return 0;
}