CF1455D Sequence and Swaps 题解
因为要求 $a_i>x$ 才可以交换,而序列要求 $a_{j\in[i+1,n]}\geq a_i$ ,所以如果有 $a_i>x$ 而不交换,那么后面都不能交换了。因此可以直接从前往后扫,遇到 $a_i>x$ 就交换。
但是显然有序的数列是不用处理的,那么我们只需要处理到最后一个乱序的位置即可。可以先遍历一遍序列,找到最后一个乱序的位置,然后就按上面的方法处理,到那个位置就停止。然后再遍历一遍判断是否有序即可,此时若仍然无序则无解。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=700;
int T,n,x,ans,b;
int a[N];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&x);b=ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<a[i-1])
b=i;//最后一个乱序的位置
}
if(b)
{
for(int i=1;i<=b;i++)
if(x<a[i])
swap(x,a[i]),ans++;//遍历 [1,b] 并处理
for(int i=1;i<=n;i++)
if(a[i]<a[i-1])
b=0;//仍然乱序
printf(!b?"-1\n":"%d\n",ans);
}
else//有序
puts("0");
}
return 0;
}