基于二分查找与插入的快速排序题解
首先,
对于操作过程,考虑一种方案:
从大到小枚举
- 若
p_i\not=i 则操作使得p_j=i 的j 。
尝试证明上述算法的正确性。显然经过上述操作后可以完成排序。而每次操作将会把序列变为:
若之前操作
若之前操作了
上述操作按理来讲可以通过一些数据结构直接维护。但是这显然太麻烦了。考虑去观察哪些情况下
证明比较简单,首先若中间存在小于
而若不存在,则任何比
#include<bits/stdc++.h>
using namespace std;
const int NN=2e6+4;
int a[NN];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(a[n]!=n)
{
printf("-1");
return 0;
}
int minn=1e9,ans=0;
for(int i=n;i>=1;i--)
{
if(a[i]<minn)
minn=a[i];
else
ans++;
}
printf("%d",ans);
return 0;
}