A permutation of n numbers is a sequence of integers from 1 to n where each number is occurred exactly once. If a permutation p1, p2, ..., pn has an index i such that pi = i, this index is called a fixed point.
A derangement is a permutation without any fixed points.
Let's denote the operation swap(a, b) as swapping elements on positions a and b.
For the given permutation find the minimal number of swap operations needed to turn it into derangement.
InputThe first line contains an integer n (2 ≤ n ≤ 200000) — the number of elements in a permutation.
The second line contains the elements of the permutation — n distinct integers from 1 to n.
In the first line output a single integer k — the minimal number of swap operations needed to transform the permutation into derangement.
In each of the next k lines output two integers ai and bi (1 ≤ ai, bi ≤ n) — the arguments of swap operations.
If there are multiple possible solutions, output any of them.
6 6 2 4 3 5 1
1 2 5
直接遍历就好了
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1000005];
int main()
{
int n;
while(cin>>n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==i)
{
sum++;
}
}
if(sum%2==0)
cout<<sum/2<<endl;
else
cout<<sum/2+1<<endl;
int ans=0;
int p;
for(int i=1;i<=n;i++)
{
if(a[i]==i)
{
ans++;
if(ans==2)
{
printf("%d %d\n",p,i);
int tmp=a[p];
a[p]=a[i];
a[i]=tmp;
ans=0;
}
else
p=i;
}
}
if(sum%2!=0)
{
for(int i=1;i<=n;i++)
{
if(a[i]!=i)
{
printf("%d %d\n",i,p);
break;
}
}
}
}
return 0;
}