题意:
A和B两个人分别对一个长度为n的排列进行打乱,打乱操作为任选两个数交换位置,A打乱\(3\times n\)次,B打乱\(7 \times n + 1\)次,现在给定一个长度为n的排列,判断是哪个人打乱的
范围&性质:\(10^3\leq n \leq10^6\)
分析:
打眼一看啥都不会
分析题意可以得到,A和B打乱的区别在于次数和奇偶性,而次数都远远大于n所以无法通过形态上的变化来得到,那么就考虑奇偶性。通过swap操作将给定序列变为顺序序列,逆向求出打乱的次数即可判断
代码:
不得不吐槽一句,cf真的是思维难度和代码量不在一个高度啊
#include<bits/stdc++.h>
using namespace std;
namespace zzc
{
const int maxn = 1e6+5;
int n,cnt=0;
int a[maxn];
void work()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
while(a[i]!=i)
{
swap(a[i],a[a[i]]);
cnt++;
}
}
if((cnt&1)==(n&1))
{
printf("Petr\n");
}
else printf("Um_nik\n");
}
}
int main()
{
zzc::work();
return 0;
}