Codeforces 987E Petr and Permutations(数组的置换与复原 、结论)

题目连接: Petr and Permutations

题意:给出一个1到n的序列,Petr打乱了3n次,Um_nik打乱了7n+1次,现在给出被打乱后的序列,求是谁打乱的。

题解:因为给出了一个3*n和一个7*n+1,发现这两个当一个为奇数另一个一定为偶数,所以可以联想和奇偶性质有关。但是这里面要算最短几步能把当前的序列变成1-n。这里我算错~~顺便学了一下如何将置换序列复原。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int MAX_N = 1e6+9;
const int INF =1e9+7;
int N,M,T,S;
int vec[MAX_N];
int main(){
    while(cin>>N)
    {
        for(int i=1;i<=N;i++) scanf("%d",&vec[i]);
        int num = 0;
        for (int i = 1; i <= N; i++)
        {
            while (vec[i] != i)
            {
                swap(vec[i], vec[vec[i]]);
                num++;
            }
        }
        if((3*N - num) % 2 == 0) cout<<"Petr"<<endl;
        else cout<<"Um_nik"<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/doggod/p/9455770.html

时间: 2024-10-10 03:32:49

Codeforces 987E Petr and Permutations(数组的置换与复原 、结论)的相关文章

Codeforces Round #485 (Div. 2) E. Petr and Permutations

Codeforces Round #485 (Div. 2) E. Petr and Permutations 题目连接: http://codeforces.com/contest/987/problem/E Description Petr likes to come up with problems about randomly generated data. This time problem is about random permutation. He decided to gene

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

codeforces A. Slightly Decreasing Permutations 题解

Permutation p is an ordered set of integers p1,??p2,??...,??pn, consisting of n distinct positive integers, each of them doesn't exceed n. We'll denote the i-th element of permutation p as pi. We'll call number n the size or the length of permutation

[树状数组][权值线段树] Codeforces 1093E Intersection of Permutations

题目描述 You are given two permutations aa and bb , both consisting of nn elements. Permutation of nn elements is such a integer sequence that each value from 11 to nn appears exactly once in it. You are asked to perform two types of queries with them: 1

Codeforces 597C. Subsequences (树状数组+dp)

题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长度为j的上升子序列个数,但是dp数组是在树状数组的update函数中进行更新. update(i, val, j)函数表示在i的位置加上val,更新dp[i][j]. sum(i, j)就是求出末尾数字小于等于i 且长度为j的子序列有多少个. 1 //#pragma comment(linker,

Codeforces 626F Group Projects(滚动数组+差分dp)

F. Group Projects time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output There are n students in a class working on group projects. The students will divide into groups (some students may be in g

Codeforces 19D Points(树状数组)

题目链接:Codeforces 19D Points 题目大意:N中操作,每次添加一个点,或者删除一个点,以及找到给定x,y坐标最近的一个坐标,并且保证xi,yi在x,y的右上角. 解题思路:这题的解法还是很机智的. y坐标离散化,然后树状数组的每个单位用一个set代替,set记录的是点集. 剩下的操作就像树状数组一样,每次添加就等于是+w的操作,移除就等于是-w,只是w是一个点,那么find操作就等于是在sum操作生成的点集中二分查找. #include <cstdio> #include

CodeForces 301D(树状数组)

题目链接:codeforces 301D 题意分析: 给你n , m两个数,1?≤?n,?m?≤?2e5,n代表n个不同数字,且这些数字都在区间[ 1 , n ]之间,这就说明1~n每个数出现一次.m代表m次查询,查询格式为两个整数x , y,问你区间[ x , y ]之间有多少对数a , b满足a%b==0. 解题思路: 考察点是区间的频繁访问,马上想到线段树和树状数组,线段树太难写了没考虑过,就说说树状数组的思路吧. 1)离线处理:把所有的插叙全部读进来再按特定顺序处理.为了让树状数组求的和

CodeForces 501D Misha and Permutations Summation

题意: n(2*10^5)个元素的排列有n!种  用Perm(x)表示字典序第x的序列(从0开始)  用Ord(排列y)表示排列y的字典序  现在输入排列p和q  求  Perm([Ord(p)+Ord(q)]%n!) 思路: 容易想到  对于第i位p[i]  如果它是第d小的数字  那么说明比它小的d-1个数字所产生的全排列都已经计数过了 例子  35142  第4位是4  它是第2小的(1和3出现过了)  那么35124这种情况一定已经计数了 因此我们可以分别对于p和q找出序列是排第几的