【题目链接】:http://codeforces.com/contest/765/problem/D

【题意】



给你一个函数f(x);

要让你求2个函数g[x]和h[x],使得g[h[x]] = x对1..m成立

h[g[x]] = f[x]对1..n成立;

这里

g[x]:[n]->[m];

h[x]:[m]->[n];

让你求h[x]的m的值,顺便输出两个函数的各个值

【题解】



这里要对f(x)做文章;

考虑f(x)==x的情况;

这时要想让

g[h[x]] = x对1..m成立

h[g[x]] = f[x]对1..n成立;

可以新加一个m;

h[++m] = x;

g[x] = m;

这样

g[h[m]] = m

h[g[x]] = x = f(x)

也成立了;

整个程序就以此为发生器;

求出了部分的g函数和全部的h函数(即只有f[x]==x的时候才能得出一个h函数);

之后对于那些还没有得到的g函数;

     rep1(i,1,n)
{
if (g[i]!=0) continue;
if (h[g[f[i]]] == f[i])
g[i] = g[f[i]];
else
return puts("-1"),0;
}

这里

因为

g[x]:[n]->[m];

h[x]:[m]->[n];

所以h[g[f[i]]]返回的也是一个1..n的值,f[i]也是在1..n;

如果

h[g[f[i]]] == f[i]成立的话;

显然可以让g[i]=g[f[i]];

因为这样

h[g[i]] = f[i]就成立了;

(上面的过程就相当于在构造一个g[i]出来让h[g[i]]=f[i]成立);

而对于g[h[i]]=i (i∈[1..m])这个条件则不用管它了;

因为所有的h数组已经全部知道了,在上面f[i]==i那个判定的时候就已经保证了

g[h[i]]=i是恒成立的了;

脑洞比较大。。想不出来

当时做的时候就想着那么多人AC了;

肯定挺简单的吧;

就随便让g[1]=1,然后以这个为发生器搞整个g和h;

还是太年轻了。



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e6+100; int n,m;
int f[N],g[N],h[N]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
rep1(i,1,n)
{
rei(f[i]);
if (f[i]==i)
{
//g[h[i]] = i
//h[g[i]] = f[i]
h[++m] = i;
g[i] = m;
}
}
rep1(i,1,n)
{
if (g[i]!=0) continue;
if (h[g[f[i]]] == f[i])
g[i] = g[f[i]];
else
return puts("-1"),0;
}
printf("%d\n",m);
rep1(i,1,n)
{
printf("%d",g[i]);
if (i==n)
puts("");
else
putchar(' ');
}
rep1(i,1,m)
{
printf("%d",h[i]);
if (i==m)
puts("");
else
putchar(' ');
}
return 0;
}

【codeforces 765D】Artsem and Saunders的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. 学习活动管理系统:LAMS

    学习活动管理系统:LAMS 一.总结 基于java的cms 二.LAMS Learning Activity Management System,学习活动管理系统. 数字化学习已经具有完整的发展方法来 ...

  2. metabase实施文档

    安装提前:需要安装JDK1.8以上 软件下载地址: https://metabase.com 还需要下载 ojdbc7.jar,以支持Oracle驱动 下载地址:http://www.oracle.c ...

  3. Unity自带网络功能——NetworkView组件、Serialize、RPC

    Unity拥有大量的第三方插件,专门提供了对网络功能的支持.可是,大部分开发人员第一次接触到的还是Unity自带的网络功能,也就是大家常常说到的Unity Networking API.这些API是借 ...

  4. Unity3d 布娃娃系统

    选中带骨骼的3d模型 GameObject->Create Other->Ragdoll... 点开发现弹出了一个Create Ragdoll的窗体 前面的基础transform把骨骼拖进 ...

  5. WCF学习笔记——WCF基础

    一 WCF与SOA SOA是一种通过为所有软件提供服务外观,并将这些服务的WSDL集中发布到一个地方的一种组织企业软件的方法.它通过使用明确定义的接口通过跨越边界传递消息来让多个自治的服务协同工作.S ...

  6. iOS_05_iOS设备发展史

    ios设备发展史 IPhone一代 * 2007年发布. * 支持电子邮件.移动电话.短信.网络浏览等. * 采取触摸键盘 * 3.5英寸,480 x 320像素. * 后置摄像投200万像素. IP ...

  7. Java抽象类中的抽象方法的参数对应的子类的方法的参数必须一致吗?

    同学你这个涉及了两个概念. 一个是抽象方法,一个是方法重载. 先说下概念: 抽象方法就是abstract描述的方法,它本身不含实现,必须由子类实现. 方法重载则是同一个方法名,但是参数类型或者参数个数 ...

  8. [Nuxt] Navigate with nuxt-link and Customize isClient Behavior in Nuxt and Vue.js

    Because Nuxt renders pages on the server, you should use the nuxt-link components to navigate betwee ...

  9. echart报表插件使用笔记(二)--按月统计

    按月统计注冊人数 java类: package com.spring.controller; import java.io.IOException; import java.sql.Connectio ...

  10. 【t043】成绩查询

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 说起测试计算机的软件,排在第一位的就应当是SuperPi 了.它不但能良好的体现机器的整体水平,而且还 ...