Codeforces.612E.Square Root of Permutation(构造)
题目链接
\(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(构造)相关推荐
- Codeforces 432E Square Tiling(结构体+贪婪)
题目连接:Codeforces 432E Square Tiling 题目大意:给出一个n∗m的矩阵,要求对该矩阵进行上色,用大写字母.可是每次上色的区域必须是正方形.不求相邻的上色区域不能有同样的颜 ...
- 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 ...
- 快速开平方根倒数算法(Fast inverse square root)的一点探究
文章目录 一.写在前面 1. 提示 2. 背景与前情 二.正文 1. 需求分析 2. 必备工具之IEEE-754浮点数表示方法 3. 同一储存单元32bits的两种不同意义 4. 公式推导 4. 本文 ...
- 平方根倒数速算法(Fast Inverse Square Root)
平方根倒数速算法(Fast Inverse Square Root) 一.背景 平方根倒数速算法是适用于快速计算积的算术平方根的倒数(在此需取符合IEEE 754标准格式的32位浮点数)的一种算法 ...
- 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 ...
- CodeForces - 715A Plus and Square Root(思维+构造)
题目链接:点击查看 题目大意:我们在玩一个游戏,屏幕上有一个数字,我们设这个数字为x,初始值为2,我们一开始的等级是k,我们每一次可以有两种操作: 加法:可以让x加上k 开根号:可以让x开根号,并且等 ...
- CodeForces - 287C Lucky Permutation(构造)
题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
- Codeforces 715A Plus and Square Root
题目链接:http://codeforces.com/problemset/problem/715/A 参考博客:http://blog.csdn.net/aozil_yang/article/det ...
最新文章
- 破局!Alan Yuille:深度学习关键在于克服组合爆炸
- 【星球知识卡片】图像风格化与翻译都有哪些核心技术,如何对其长期深入学习...
- mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法
- HDU2879(积性函数)
- nginx+tomcat+redis负载均衡,实现session共享
- Jmeter系列之数据库操作
- C#驱动级模拟按键操作
- vrml行走和静止的人代码_CAE二次开发的核心不是代码
- hiberante中get和load方法的区别
- android加载图片+背景,Android开发中ImageLoder加载网络图片时将图片设置为ImageView背景的方法...
- LabelImg安装
- 达芬奇剪辑调色专用键盘DaVinci Resolve Speed Editor
- C++程序设计:输出n层金字塔图形
- 篇2:基于windows10专业版搭建ftp服务器
- matlab怎样编写延时函数,编写延时函数的简单方法
- 百度飞桨携手精诺数据打造智慧熔炼,AI让年轻人一秒变身“老师傅”
- 计算机的资源管理器是电脑上的哪个图标,Win10资源管理器中“此电脑”光驱图标不见了怎么办?解决方法...
- 七牛云融合CDN到底怎么配置?
- 谷歌浏览器中文乱码问题的解决
- Hive编程指南中的命令
热门文章
- 泽众性能测试软件,软件测试工具-测试管理工具-自动化测试工具-性能测试工具-SPASVO泽众软件测试网...
- java编程两个超长正整数相减_【每日编程237期】数字分类
- 服务器上的文件如何查看,如何查看远程服务器上的文件
- Python入门--字符串的查询操作,find,rfind,index,rindex
- Easy Summation 假的自然数幂的和
- mysql 丛集_MYSQL
- 试题17 方程的解(枚举法)
- 试题14 回文数(详解)
- Codeforces Round #224 (Div. 2): C. Arithmetic Progression(模拟)
- 玲珑杯round11-B:萌萌哒的第二题