【NOI模拟赛(湖南)】DeepDarkFantasy
DeepDarkFantasy
从东京出发,不久便到一处驿站,写道:日暮里。 ——鲁迅《藤野先生》
定义一个置换的平方为对1~n的序列做两次该置换得到的序列。已知一个置换的平方,并且这个结果是一个排列,求该置换。
输入第一行一个数n表示排列长度,接下来一行n个数描述排列。
有解则输出一行n个数表示原排列。否则输出一行一个-1。
|
测试点编号 |
特征 |
|
0~1 |
n<=10 |
|
2~9 |
n<=1000000 |
【题解】
注:由于置换和排列在数学表现形式上是一样的,于是下文不对此进行详细区分。
首先对于任意一个排列,我们都可以将其看作一个有向图,即若排列中第i个点为x,那么相应的图中就会有一条从i连向x的边。那么对于一个置换的平方所得到的置换,相当于如果原图中有一条从x到y的边和一条从y到z的边,那么在新图中就会有一条从x到z的边。通过观察发现,原图中只有环的奇偶性会对答案的构成方式产生影响,于是我们可以对奇环和偶环分别进行讨论得到答案。
对于奇环的情况,可以令一个有5个点奇环为12345,那么在图中移动两步得到的图会是13524,那么如果中间有一个奇环的话,我们就可以按顺序遍历环的前一半和后一半得到原来的环。
对于偶环的情况,假设有一个偶环为123456,那么最终的结果会是形成两个环135与246,那么我们每次可以每次去两个环的同一位置上的数接在一起得到原来的环。
由于奇环所得到的答案一定是一个奇环,偶环得到的答案一定是两个长度相等的环,那么无解的情况就显然是新图中偶环的个数为奇数个。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 1000100
int n,len,a[MAXN],vis[MAXN],id[MAXN],ans[MAXN];
vector<int> c[MAXN];
inline int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
bool cmp(int a,int b)
{return c[a].size()<c[b].size();}
void dfs(int x)
{
c[len].push_back(x);
vis[x]=;
if(!vis[a[x]]) dfs(a[x]);
}
int main()
{
freopen("deepdarkfantasy.in","r",stdin);
freopen("deepdarkfantasy.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[read()]=i;
for(int i=;i<=n;i++)
if(!vis[i]) {len++; dfs(i);}
for(int i=;i<=len;i++) id[i]=i;
sort(id+,id+len+,cmp);
for(int i=;i<=len;i++)
{
if(c[id[i]].size()&) //奇环
{
int mid=c[id[i]].size()>>;
mid++;
for(int j=;j<c[id[i]].size();j++)
ans[c[id[i]][j]]=c[id[i]][(j+mid)%c[id[i]].size()];
}
else //偶环
{
if(c[id[i]].size()!=c[id[i+]].size())
{
printf("-1\n");
return ;
}
else
{
for(int j=;j<c[id[i]].size();j++)
{
ans[c[id[i]][j]]=c[id[i+]][j];
ans[c[id[i+]][j]]=c[id[i]][(j+)%c[id[i]].size()];
}
i++;
}
}
}
for(int i=;i<=n;i++) printf("%d ",ans[i]);
printf("\n");
return ;
}
【NOI模拟赛(湖南)】DeepDarkFantasy的更多相关文章
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
- NOI模拟赛Day5
T1 有and,xor,or三种操作,每个人手中一个数,求和左边进行某一种运算的最大值,当t==2时,还需要求最大值的个数. test1 20% n<=1000 O(n^2)暴力 test2 2 ...
- NOI模拟赛Day4
看到成绩的时候我的内心** woc第一题写错了呵呵呵呵呵呵呵呵 人不能太浪,会遭报应的** ------------------------------------------------------ ...
- NOI模拟赛Day3
终于A题啦鼓掌~开心~ 开考看完题后,觉得第二题很好捏(傻叉上线 搞到十一点准备弃疗了然后突然发现我会做第一题 于是瞎码了码,就去准备饭票了... 好了,停止扯淡(就我一个我妹子每天不说话好难受QAQ ...
- NOI模拟赛Day2
深深的感受到了自己的水 ---------------------------------------------------------------------------------------- ...
- NOI 模拟赛
T1 Article 给 $m$ 个好串,定义一个字符串分割方案是好的当且仅当它分割出来的子串中"是好串的子串"的串长占原串串长超过 85%,定义一个好的分割方案的权值为这种分割方 ...
随机推荐
- nginx+php与apache+php性能对比
测试工具http_load相同的动态页面测试,相同的硬件资源,相同并发,相同请求数量的前提下,nginx+php比apache+php的性能要 差,而且如果请求的压力大于硬件资源的承受能力,nginx ...
- LotusPhp起步:经典的HelloWorld
写了几篇LotusPhp,一直没有跑个程序,感觉好像步骤有点错,所以先上个经典的Demo,HelloWorld吧 先按推荐目录建好文件夹,如果懒的建,下面有下载的Demo包,解压就可以用,因为简单,也 ...
- 对phpcms中{L('news')}的讲解
直切话题 对于phpcms分M,C,A,那么现在要讲解的L是跟着M走的,每个M在languages中都有一个.lang.php文件,如Mcontent,就有一个content.lang.php,找到对 ...
- win7修改软件【授权给…】后面的名称
很简单,按下图打开注册表,修改: Ctrl+F分别搜索以下三个键值,搜到后修改为你想显示的名称即可即可. 1:UserName 2:RegisteredOrganazition 3:Registere ...
- Android中style的使用
摘自搜搜问问. <item name="#1">#2</item> 1.item 的name属性#1可以为所有系统所带组件的属性,#2为此属性的值如andr ...
- ADO.NET 结构 集中数据库联接结构
MSDN 原文出处 https://msdn.microsoft.com/zh-cn/library/27y4ybxw.aspx .NET Framework 4.6 and 4.5 其他版本 以前, ...
- openSUSE13.1 Yast 中所有软件图形化界面无法打开,问题原因: Ruby
因为使用rvm安装了新的Ruby,而openSUSE13.1的YaST又是用Ruby的.....解决方案暂时没有
- 自学Python二 Python中的屠龙刀(续)
函数 秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数! 正常的诸如空函数,默认参数等等我们就不提了,在这里着重提一下默认参数里面的坑和lambda函数. 当 ...
- chattr 与 lsattr 命令详解
PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的li ...
- Sql Server 语句
##目录 #####清除缓存 DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS; SELECT stock.IdStock, stock.Descr FROM [In ...