个人训练赛

Derangement

 Gym - 100971B 

&:把需要调换的记录一下,如果偶数个就两两调换,如果是奇数个,就先调偶数个,剩下一个与随便一个需要调换的调换,特判一下只有一个的时候。

#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;
}