思维-B. Petr and Permutations

B. Petr and Permutations

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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 11 to nn and then 3n3n 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+17n+1 times instead of 3n3n 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 nn (103≤n≤106103≤n≤106).

In the second line there are nn distinct integers between 11 and nn — the permutation of size nn from the test.

It is guaranteed that all tests except for sample are generated this way: First we choose nn — 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 nn) 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.

题意:给一个长度为 n 的序列 S表示,问 从 1-n 递增排序的序列 X表示变到 S(一次可以交换任意两个数字),总共交换的次数              如果是 3*n,则输出 Petr ,否则输出 另一个。

题解:找出逆序对,3*n - 逆序对数==偶数则输出Petr(易证)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1000005],t[1000005],ans=0;

void dfs(int l,int r){
	if(l==r)
	  return ;
	int mid=(l+r)>>1;
	dfs(l,mid);
	dfs(mid+1,r);
	
	int i=l,j=mid+1,p=l;
	while(i<=mid&&j<=r){
		if(a[i]>a[j]){
			t[p++]=a[j++];
			ans+=(mid-i+1);
		}
		else{
			t[p++]=a[i++];
		}
	}
	while(i<=mid){
		t[p++]=a[i++];
	}
	while(j<=r){
		t[p++]=a[j++];
	}
	for(int k=l;k<=r;k++)
	   a[k]=t[k];
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	ans=0;
	dfs(0,n-1);
	int sum=3*n;
	if((sum-ans)%2==0){
		printf("Petr\n");
	}
	else{
		printf("Um_nik\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Process是一个抽象类,它继承自Object类。通过使用ProcessBuilder.start()方法或Runtime.exec方法,可以创建一个本机进程的实例,并用于控制该进程以及获取相关信息。Process类提供了执行进程输入、执行进程输出、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程等方法。 以下是一个示例代码,展示了如何使用Process类创建并执行一个ping命令的进程,并打印输出结果: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessDemo { public static void main(String[] args) { try { Process process = Runtime.getRuntime().exec("ping www.baidu.com"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk")); String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } System.out.println("任务执行完毕!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码使用Runtime.getRuntime().exec("ping www.baidu.com")创建了一个ping百度的进程,并通过BufferedReader读取进程输出流并打印出来。最后输出"任务执行完毕!"表示进程执行结束。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java Process详解](https://blog.csdn.net/weixin_45433031/article/details/125327662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值