输入n
然后n个数字
输出需要换几次

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct data
{
int val;
int no;
int N;
}a[500009];
int hash[500009];
int cmp(data a,data b)
{
return a.val<b.val;
}
int cmp1(data a,data b)
{
return a.no<b.no;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].no=i;
}
sort(&a[1],&a[n+1],cmp);
for(i=1;i<=n;i++)
{
a[i].N=i;
}
sort(&a[1],&a[n+1],cmp1);
for(i=1;i<=n;i++)
{
hash[a[i].no]=a[i].N;
}
int all=0;
for(i=1;i<=n;i++)
{
int add=0;
int temp=i;
while(hash[a[temp].no]!=-1&&hash[a[temp].no]!=a[temp].no)
{
int re=hash[a[temp].no];
hash[a[temp].no]=-1;
temp=re;
add++;
}
if(add>=1)
all+=add-1;
}
printf("%d\n",all);
}
}