AcWing 5466. 随机排列 题解

讲解都在代码里了

#include <bits/stdc++.h>

//可以发现不管n怎么取,3n和7n+1都是一个奇数一个偶数
//那么那么我们用最多n-1次交换将数组复原看一看用了奇数次还是偶数次就可以看出来了
//这种交换方式常见于基础课内容,是两个数组互为双向

using namespace std;

const int N=1e6+10;
int a[N];//存放序列;
int b[N];//存放数字的位置

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[a[i]]=i;
    }
    //现在已经存放完毕,接下来复原

    int sum=0;//来记录一共要交换几次;

    for(int i=1;i<=n-1;i++)
    {
        if(a[i]==i)continue;
        //如果说这个位置没有放好的话,交换一次把数放过来
        int s1=b[i];//先找到应该在这里的那个数的当前位置
        int s2=i;//这是这个数应该在的位置
        int n1=i;//这是这个数
        int n2=a[i];//这是应该被弄走的数

        a[s2]=n1;
        a[s1]=n2;
        b[n1]=s2;
        b[n2]=s1;
        sum++;
    }

    if(n%2==1)
    {
        if(sum%2==1)cout<<1;
        else cout<<2;
    }
    else
    {
        if(sum%2==0)cout<<1;
        else cout<<2;
    }
    return 0;
}
posted @ 2024-02-03 22:30  BadBadBad__AK  阅读(53)  评论(1)    收藏  举报