[CF 612E]Square Root of Permutation
2018-01-24 20:44
393 查看
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.
The second line contains n distinct integers p1, p2, ..., pn (1 ≤ pi ≤ n) — the elements of permutation p.
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.
对于平方后的置换q中的奇数环,直接在里面推。偶数环就看是否有相同大小的偶数环与它合并。
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.
Examples
input
4 2 1 4 3
output
3 4 2 1
input
4 2 1 3 4
output
-1
input
5 2 3 4 5 1
output
4 5 1 2 3
题目大意:
给你个置换p,然后做平方运算,得到置换q,题目给你q,问你能否找到p,要构造出来。题解:
这道题要求倒推出一个置换,由于原置换p中的环不一定全是奇数环,所以平方之后有可能有环会裂开。对于平方后的置换q中的奇数环,直接在里面推。偶数环就看是否有相同大小的偶数环与它合并。
//Never forget why you start #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std; int n,m,a[1000005],lm,ans[1000005],q[1000005]; struct node{ int sum; vector<int>p; friend bool operator < (const node a,const node b){ return a.sum<b.sum; } }s[1000005]; int vis[1000005],cnt; void dfs(int r){ vis[r]=1; cnt++; s[lm].p.push_back(r); if(vis[a[r]])return; else dfs(a[r]); } int main(){ int i,j; scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<=n;i++) if(!vis[i]){ cnt=0; lm++; dfs(i); s[lm].sum=cnt; } sort(s+1,s+lm+1); bool flag=0; for(i=1;i<=lm;i++){ if(s[i].sum&1)continue; else{ if(s[i+1].sum==s[i].sum){i++;continue;} else {flag=1;break;} } } if(flag){printf("-1\n");return 0;} for(i=1;i<=lm;i++){ if(s[i].sum&1){ for(j=0;j<s[i].sum;j++) q[j*2%s[i].sum]=s[i].p[j]; for(j=0;j<s[i].sum-1;j++) ans[q[j]]=q[j+1]; ans[q[s[i].sum-1]]=q[0]; } else{ int k=i+1; for(j=0;j<s[i].sum;j++){ ans[s[i].p[j]]=s[k].p[j]; ans[s[k].p[j]]=s[i].p[(j+1)%s[i].sum]; } i++; } } for(i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }
相关文章推荐
- Codeforces 612E - Square Root of Permutation
- Codeforces 612E - Square Root of Permutation (置换+构造)
- Educational Codeforces Round 4 E. Square Root of Permutation(置换、构造)
- Codeforces 612 E Square Root of Permutation
- Square Root of Permutation - CF612E
- CF 715A Plus and a square root(数学构造)
- Algorithm to find square root of an algorithm
- LeeCode-Sqrt(x)Implement int sqrt(int x). Compute and return the square root of x.
- Continued Fraction of Squareroot
- Continued Fraction of Squareroot
- [LinkedIn] Find Sqrt square root of a number (binary search)
- 1066. Root of AVL Tree (25)
- AOJ-AHU-OJ-298 Rings of square grid
- Applications are expected to have a root view controller at the end of application launch
- 解决Fiddler出现无线弹框 "creation of the root certificate was not successful”的问题
- 04-树5 Root of AVL Tree (25分)
- Applications are expected to have a root view controller at the end of application解决办法
- 1066. Root of AVL Tree (25)
- '-[__NSCFString replaceOccurrencesOfString:withString:options:range:]: nil argument'
- Fiddler问题 - creation of the root certificate was not successful