Square Root of Permutation - CF612E
Description
A permutation of length n is an array containing each integer from 1 to n exactly once. For example, q = [4, 5, 1, 2, 3] is a permutation. For the permutation q the square of permutation is the permutation p that p[i] = q[q[i]] for each i = 1... n. For example, the square of q = [4, 5, 1, 2, 3] is p = q2 = [2, 3, 4, 5, 1].
This problem is about the inverse operation: given the permutation p you task is to find such permutation q that q2 = p. If there are several such q find any of them.
Input
The first line contains integer n (1 ≤ n ≤ 106) — the number of elements in permutation p.
The second line contains n distinct integers p1, p2, ..., pn (1 ≤ pi ≤ n) — the elements of permutation p.
Output
If there is no permutation q such that q2 = p print the number "-1".
If the answer exists print it. The only line should contain n different integers qi (1 ≤ qi ≤ n) — the elements of the permutation q. If there are several solutions print any of them.
Sample Input
4
2 1 4 3
3 4 2 1
4
2 1 3 4
-1
5
2 3 4 5 1
4 5 1 2 3
简单题意
给出一个大小为n的置换群p,求一个置换群q,使得q^2=p
胡说题解
首先我们观察q^2是怎么运算的,置换群可以看成一个一个的环,每个点i向a[i]连一条边就是那个图
q^2其实就是把i的边变成a[a[i]],也就是在环上走两步,然后q原本的环就变了
1.假设原来是奇数环,那么后来还是一个奇数环,只是顺序变了
2.假设原来是偶数环,那么就会拆成两个大小为一半的环
我们再看p
p上的奇数环可能是原来的奇数环,也有可能是偶数环拆开得来的
p上的偶数环只可能是原来的偶数环拆开得来
对于奇数环我们只要把这个环的后半部分与前半部分(先把这个环断开)交替插入就可以构造出原来的那个奇数环
对于偶数环我们就只能找一个相同大小的偶数环交替插入,即两个相同大小的偶数环合并,如果找不到相同大小的偶数环,那么我们就知道不存在这样的q使得q^2=p
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=; int n,tot,a[maxn],b[maxn],s[maxn],l[maxn],cir[maxn];
bool flag[maxn]; bool com(int a,int b){
return l[a]<l[b];
} int main(){
scanf("%d",&n);
int i,j,k;
for(i=;i<=n;i++)scanf("%d",&a[i]);
for(i=;i<=n;i++)
if(!flag[i]){
cir[++tot]=i;
flag[i]=true;
++l[i];
j=a[i];
while(!flag[j]){
flag[j]=true;
++l[i];
j=a[j];
}
}
sort(cir+,cir++tot,com);
int x=;
bool f=true;
for(i=;i<=tot;i++)
if((l[cir[i]]&)== ){
if(x==)x=l[cir[i]];
else
if(x==l[cir[i]])x=;
else f=false;
}
if(x!=)f=false;
if(f==false)printf("-1");
else{
for(i=;i<=tot;i++){
if((l[cir[i]]&)==){
j=cir[i];
k=;
while(flag[j]){
s[k]=j;
flag[j]=false;
k=(k+)%l[cir[i]];
j=a[j];
}
for(j=;j<l[cir[i]]-;j++)b[s[j]]=s[j+];
b[s[l[cir[i]]-]]=s[];
}
else{
j=cir[i];
k=cir[i+];
while(flag[j]){
b[j]=k;
b[k]=a[j];
flag[j]=false;
flag[k]=false;
j=a[j];
k=a[k];
}
++i;
}
}
for(i=;i<=n;i++)printf("%d ",b[i]);
}
return ;
}
AC代码
Square Root of Permutation - CF612E的更多相关文章
- Codeforces 612E - Square Root of Permutation
E. Square Root of Permutation A permutation of length n is an array containing each integer from 1 t ...
- CF612E Square Root of Permutation
题目分析 我们首先模拟一下题意 假设有一个 \(q _1\) \(p\) \(a_1\) \(a_x\) \(a_{a_1}\) \(a_{a_x}\) \(q\) \(x\) \(a_1\) \(a ...
- codefroces 612E Square Root of Permutation
A permutation of length n is an array containing each integer from 1 to n exactly once. For example, ...
- [CF 612E]Square Root of Permutation
A permutation of length n is an array containing each integer from 1 to n exactly once. For example, ...
- Codeforces.612E.Square Root of Permutation(构造)
题目链接 \(Description\) 给定一个\(n\)的排列\(p_i\),求一个排列\(q_i\),使得对于任意\(1\leq i\leq n\),\(q_{q_i}=p_i\).无解输出\( ...
- Codeforces 715A. Plus and Square Root[数学构造]
A. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Project Euler 80:Square root digital expansion 平方根数字展开
Square root digital expansion It is well known that if the square root of a natural number is not an ...
- Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))
C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- (Problem 57)Square root convergents
It is possible to show that the square root of two can be expressed as an infinite continued fractio ...
随机推荐
- Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转
Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...
- Ruby基础教程 1-10
类结构 1.数值类结构 Fixnum到Bignum会自动转换 2.常用数值表示 3. ans=10.divmod(3) ans[0]是商 ans[1]是余数 4.实例方法roun ...
- 第四篇 与Flask相关的插件(flask-session、wtforms)
公司中使用SQL的种方式: 1. 写Django:ORM(关系对象映射), 2. 写Flask和其他:有两种方式: (1) 原生SQL:使用原生SQL有两种选择: A. pymysql (python ...
- Unity操作小技巧
1.操作类 1)F:选择物体后聚焦 2)V:选择物体的顶点,顶点吸附 3)Ctrl:摁住后拖动物体,可以按照系统设置的步长进行移动(Edit -> Snap setting) 4)Q W E R ...
- 银行系统ps:不太完善,蟹蟹评论
# 主程序运行 import time from guanli import GuanLi from atm import ATM from user import User def main(): ...
- phantomjs抛出IOException
使用phantomjs对网页进行截图遇到的问题 问题描述: 使用的phantomjs版本:phantomjs-2.1.1-windows 使用的截图js文件,\phantomjs-2.1.1-wind ...
- 【主席树维护mex】 【SG函数递推】 Problem H. Cups and Beans 2017.8.11
Problem H. Cups and Beans 2017.8.11 原题: There are N cups numbered 0 through N − 1. For each i(1 ≤ i ...
- [c++] Getting Started - CMake
CMake is an open-source cross platform build system, according to CMake's creator, Kitware. But CMak ...
- HDU 1512 Monkey King(左偏树)
Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each does thi ...
- iOS- UITableViewCell对象是怎么重用的 ?
iOS设备的内存有限,如果用UITableView显示成千上万条数据, 就需要成千上万个UITableViewCell对象的话, 那将会耗尽iOS设备的内存.要解决该问题,需要重用UITableVie ...