题目描述
E. Petr and Permutations
Petr likes to come up with problems about randomly generated data. This time problem is about random permutation. He decided to generate a random permutation this way: he takes identity permutation of numbers from 1
to n and then 3n times takes a random pair of different elements and swaps them. Alex envies Petr and tries to imitate him in all kind of things. Alex has also come up with a problem about random permutation. He generates a random permutation just like Petr but swaps elements 7n+1 times instead of 3n
times. Because it is more random, OK?!
You somehow get a test from one of these problems and now you want to know from which one.
Input
In the first line of input there is one integer n
(103≤n≤106
).
In the second line there are n
distinct integers between 1 and n — the permutation of size n
from the test.
It is guaranteed that all tests except for sample are generated this way: First we choose n
— the size of the permutation. Then we randomly choose a method to generate a permutation — the one of Petr or the one of Alex. Then we generate a permutation using chosen method.
Output
If the test is generated via Petr’s method print “Petr” (without quotes). If the test is generated via Alex’s method print “Um_nik” (without quotes).
Example
Input
Copy
5
2 4 5 1 3
Output
Copy
Petr
Note
Please note that the sample is not a valid test (because of limitations for n
) and is given only to illustrate input/output format. Your program still has to print correct answer to this test to get AC.
Due to randomness of input hacks in this problem are forbidden.
题目链接
链接: https://codeforces.com/problemset/problem/987/E.
思路
有一个定理:在一个序列中,交换两个任意的数字都会改变奇数个逆序对。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e6 + 1e3;
typedef long long int LL;
LL n , cnum[N];
int lowbit(int x){
return x&(-x);
}
void add(int index , int tonum){
for(int i = index ; i <= n ; i += lowbit(i) ) {
cnum[i] += tonum;
}
}
LL getSum(int index){
LL res = 0;
for(int i = index ; i > 0 ; i -= lowbit(i)){
res += cnum[i];
}
return res;
}
int main(){
ios::sync_with_stdio(false);
int i , j , tmp;
LL res = 0;
cin>>n;
for(i = 1 ; i <= n ; i ++ ){
cin>>tmp;
add(tmp , 1);
res += i-getSum(tmp);
}
if((res&1) == (n&1)){
cout<<"Petr"<<endl;
}
else cout<<"Um_nik"<<endl;
return 0;
}