SDUT 2021 Winter Individual Contest - N(B-Derangement)

Posted 如风如影�

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUT 2021 Winter Individual Contest - N(B-Derangement)相关的知识,希望对你有一定的参考价值。

B - Derangement

题目链接: link.
原题描述:
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.
The 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

题目大意为给你1-n个数,这一串数不能让a[i]=i,类似于错排 。碰到a[i]=i的时候要和其他数进行交换,使其满足a[i]!=i。这道题的坑比较多,测试点也很多。要考虑总数,比如奇数的时候,可能会出现单的情况,这时候就只需判断这个数是不是1,如果是则把这个数和最开始的数交换(只写出一种交换情况就行),不是1的话直接把它和1交换即可。那么若一共偶数个的话,就两两交换即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=200001;
int a[N],b[N];
int main()

    int n,j=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    
        cin>>a[i];
        if(a[i]==i) b[j++]=a[i];//将不满足条件的存入一个新数组中
    
    cout<<(j+1)/2<<endl;
    for(int i=0;i+1<j;i=i+2)
    
        printf("%d %d\\n",b[i],b[i+1]);
    
    if(j&1)//二进制判断是否为奇数,运行时间会更短
    
        if(b[j-1]!=1)
        printf("%d 1\\n",b[j-1]);
        else printf("%d %d\\n",b[j-1],n);
    

   return 0;


以上是关于SDUT 2021 Winter Individual Contest - N(B-Derangement)的主要内容,如果未能解决你的问题,请参考以下文章

SDUT 2022 Winter Team Contest - 1

SDUT 2022 Winter Team Contest - 1

SDUT 2022 Winter Individual Contest - A(D)

SDUT 2022 Winter Individual Contest - D(K)

SDUT 2022 Winter Individual Contest - D(K)

SDUT 2022 Winter Individual Contest - D(K)