题目链接


\(Description\)

给定一个\(n\)的排列\(p_i\),求一个排列\(q_i\),使得对于任意\(1\leq i\leq n\),\(q_{q_i}=p_i\)。无解输出\(-1\)。
\(1\leq n\leq10^6\)。

\(Solution\)

对排列\(q_i\)我们建一张图,边为\(i\to q_i\)。显然这张图是由几个环构成。
发现对于\(q_{q_i}\)的图,原来\(q_i\)中的奇环它们还是类似的一个奇环,原来的偶环会分裂成两个大小相等的偶环。
所以对\(p_i\)建图,找出里面的环,是奇环就把相邻点间隔为\(2\)地插入到环里,是偶环就找到和它一样大的一个合并,找不到就无解。这样就可以得到\(q_i\)的图了。(每个偶环只能合并一次→_→)
复杂度\(O(n)\)。


//249ms 21300KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 1000000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+5;int nxt[N],q[N],tmp[N],tmp2[N],id[N];
bool vis[N];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}int main()
{const int n=read();for(int i=1; i<=n; ++i) nxt[i]=read();for(int s=1; s<=n; ++s)if(!vis[s]){int cnt=0,x=s;do{tmp[++cnt]=x, vis[x]=1, x=nxt[x];}while(x!=s);if(cnt&1){for(int i=1,now=0; i<=cnt; ++i,(now+=2)>=cnt&&(now-=cnt)) tmp2[now]=tmp[i];for(int i=0; i<cnt; ++i) q[tmp2[i]]=tmp2[i+1];q[tmp2[cnt-1]]=tmp2[0];}else{if(!id[cnt]) id[cnt]=s;else{int y=id[cnt],x=y,t=0;do{tmp2[++t]=x, x=nxt[x];}while(x!=y);for(int t1=1,t2=1,las=tmp[1],i=t<<1; i; --i)las=q[las]=i&1?tmp[++t1]:tmp2[t2++];q[tmp2[t]]=tmp[1], id[t]=0;}}}for(int i=2; i<=n; i+=2) if(id[i]) return puts("-1"),0;for(int i=1; i<=n; ++i) printf("%d ",q[i]);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10528010.html

Codeforces.612E.Square Root of Permutation(构造)相关推荐

  1. Codeforces 432E Square Tiling(结构体+贪婪)

    题目连接:Codeforces 432E Square Tiling 题目大意:给出一个n∗m的矩阵,要求对该矩阵进行上色,用大写字母.可是每次上色的区域必须是正方形.不求相邻的上色区域不能有同样的颜 ...

  2. UVA10023 Square root【大数】

    You are to determinate X by given Y , from expression X =Y\sqrt{Y}Y​ Input The first line is the num ...

  3. 快速开平方根倒数算法(Fast inverse square root)的一点探究

    文章目录 一.写在前面 1. 提示 2. 背景与前情 二.正文 1. 需求分析 2. 必备工具之IEEE-754浮点数表示方法 3. 同一储存单元32bits的两种不同意义 4. 公式推导 4. 本文 ...

  4. 平方根倒数速算法(Fast Inverse Square Root)

    平方根倒数速算法(Fast Inverse Square Root) 一.背景   平方根倒数速算法是适用于快速计算积的算术平方根的倒数(在此需取符合IEEE 754标准格式的32位浮点数)的一种算法 ...

  5. The Square Root of Three 孤独的根号三 David B. Feinberg 大卫·范伯格

    The Square Root of Three 孤独的根号三 David B. Feinberg 大卫·范伯格 I'm sure that I will always be A lonely num ...

  6. CodeForces - 715A Plus and Square Root(思维+构造)

    题目链接:点击查看 题目大意:我们在玩一个游戏,屏幕上有一个数字,我们设这个数字为x,初始值为2,我们一开始的等级是k,我们每一次可以有两种操作: 加法:可以让x加上k 开根号:可以让x开根号,并且等 ...

  7. CodeForces - 287C Lucky Permutation(构造)

    题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi​​=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...

  8. Codeforces 482 - Diverse Permutation 构造题

    这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ....... ...

  9. Codeforces 715A Plus and Square Root

    题目链接:http://codeforces.com/problemset/problem/715/A 参考博客:http://blog.csdn.net/aozil_yang/article/det ...

最新文章

  1. 破局!Alan Yuille:深度学习关键在于克服组合爆炸
  2. 【星球知识卡片】图像风格化与翻译都有哪些核心技术,如何对其长期深入学习...
  3. mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法
  4. HDU2879(积性函数)
  5. nginx+tomcat+redis负载均衡,实现session共享
  6. Jmeter系列之数据库操作
  7. C#驱动级模拟按键操作
  8. vrml行走和静止的人代码_CAE二次开发的核心不是代码
  9. hiberante中get和load方法的区别
  10. android加载图片+背景,Android开发中ImageLoder加载网络图片时将图片设置为ImageView背景的方法...
  11. LabelImg安装
  12. 达芬奇剪辑调色专用键盘DaVinci Resolve Speed Editor
  13. C++程序设计:输出n层金字塔图形
  14. 篇2:基于windows10专业版搭建ftp服务器
  15. matlab怎样编写延时函数,编写延时函数的简单方法
  16. 百度飞桨携手精诺数据打造智慧熔炼,AI让年轻人一秒变身“老师傅”
  17. 计算机的资源管理器是电脑上的哪个图标,Win10资源管理器中“此电脑”光驱图标不见了怎么办?解决方法...
  18. 七牛云融合CDN到底怎么配置?
  19. 谷歌浏览器中文乱码问题的解决
  20. Hive编程指南中的命令

热门文章

  1. 泽众性能测试软件,软件测试工具-测试管理工具-自动化测试工具-性能测试工具-SPASVO泽众软件测试网...
  2. java编程两个超长正整数相减_【每日编程237期】数字分类
  3. 服务器上的文件如何查看,如何查看远程服务器上的文件
  4. Python入门--字符串的查询操作,find,rfind,index,rindex
  5. Easy Summation 假的自然数幂的和
  6. mysql 丛集_MYSQL
  7. 试题17 方程的解(枚举法)
  8. 试题14 回文数(详解)
  9. Codeforces Round #224 (Div. 2): C. Arithmetic Progression(模拟)
  10. 玲珑杯round11-B:萌萌哒的第二题