个人训练赛
Derangement
&:把需要调换的记录一下,如果偶数个就两两调换,如果是奇数个,就先调偶数个,剩下一个与随便一个需要调换的调换,特判一下只有一个的时候。
#include <bits/stdc++.h>
using namespace std;
int a[200006];
int main()
{
int n,p,x;
scanf("%d", &n);
p = 0;
for (int i = 0; i < n; i ++)
{
scanf("%d", &x);
if(x == i + 1) a[p++] = x;
}
if(p % 2 == 0)
{
printf("%d\n",p/2);
for(int i = 0; i < p; i += 2)
{
printf("%d %d\n", a[i],a[i+1]);
}
}
else
{
printf("%d\n", p / 2 + 1);
if(p == 1)
{
if(a[0] != 1)printf("%d %d\n",a[0],a[0] - 1);
else printf("%d %d\n",a[0],a[0] + 1);
}
else
{
for(int i = 0; i < p - 1; i += 2)
{
printf("%d %d\n",a[i],a[i + 1]);
}
printf("%d %d\n",a[0],a[p - 1]);
}
}
return 0;
}