CodeForces - 987E(逆序对定理+树状数组)

题目描述

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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值