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

题意:题目中给出你两个公式,g(h(x))==x,h(g(x))==f(x)。现给你f(x)

让你求符合条件的g序列和h序列。

题解:一道数学构造题。

很明显从h(g(x))==f(x),g(h(x))==x,(g(h(x)) 1~m)可以得到h(1~m)要取所有f(x)的值

所以m的值就是f(x)中不重复的值。

然后就是h(x)的取值了,由于取值方法太多所以可能是任意取法都行或者有什么约束条件,不妨

设h(x1)=a , h(x2) = b -> g(a) = x1 , g(b) = x2 -> h(x1)=f(a) , h(x2)=f(b);

又设h(x2) = a , h(x1) = b -> g(a) = x2 , g(b) = x1 -> h(x2)=f(a) , h(x1)=f(b);

可以任意两个位置交换并不影响结果,所以h可以任意取值。所以最后只要取好h然后再给对应的

g附上值然后再利用h(g(x))==f(x)来验证一下就行

#include <iostream>
#include <cstring>
using namespace std;
const int M = 1e5 + 10;
int f[M] , h[M] , g[M] , du[M];
bool vis[M];
int main() {
int n;
cin >> n;
memset(vis , false , sizeof(vis));
memset(g , 0 , sizeof(g));
int m = 0 , count = 0;
for(int i = 1 ; i <= n ; i++) {
cin >> f[i];
if(!vis[f[i]]) {
h[++m] = f[i];
du[f[i]] = m;
vis[f[i]] = true;
}
}
for(int i = 1 ; i <= m ; i++) {
g[h[i]] = i;
}
int flag = 0;
for(int i = 1 ; i <= n ; i++) {
if(g[i]) {
if(h[g[i]] != f[i]) {
flag = 1;
break;
}
}
}
if(flag) {
cout << -1 << endl;
}
else {
cout << m << endl;
for(int i = 1 ; i <= n ; i++) {
if(!g[i]) {
g[i] = du[f[i]];
}
}
for(int i = 1 ; i <= n ; i++) {
cout << g[i] << ' ';
}
cout << endl;
for(int i = 1 ; i <= m ; i++) {
cout << h[i] << ' ';
}
cout << endl;
}
return 0;
}

codeforces 765 D. Artsem and Saunder(数学题)的更多相关文章

  1. Codeforces 765 E. Tree Folding

    题目链接:http://codeforces.com/problemset/problem/765/E $DFS子$树进行$DP$ 大概分以下几种情况: 1.为叶子,直接返回. 2.长度不同的路径长度 ...

  2. D. Artsem and Saunders 数学题

    http://codeforces.com/contest/765/problem/D 这题的化简,不能乱带入,因为复合函数的带入,往往要严格根据他们的定义域的 题目要求出下面两个函数 g[h(x)] ...

  3. 【codeforces 765D】Artsem and Saunders

    [题目链接]:http://codeforces.com/contest/765/problem/D [题意] 给你一个函数f(x); 要让你求2个函数g[x]和h[x],使得g[h[x]] = x对 ...

  4. Codeforces 707C. Pythagorean Triples-推公式的数学题

    两道C题题解,能推出来公式简直是无敌. http://codeforces.com/problemset/problem/707/C codeforces707C. Pythagorean Tripl ...

  5. codeforces 801 D. Volatile Kite(数学题)

    题目链接:http://codeforces.com/contest/801/problem/D 题意:求出一个最大值D,使得一个给定的凸多边形任意点移动范围在半径为D的圆中,都不会构成一个凹都边形. ...

  6. codeforces 340C Tourist Problem(简单数学题)

    题意:固定起点是0,给出一个序列表示n个点,所有点都在一条直线上,其中每个元素代表了从起点到这个点所走的距离.已知路过某个点不算到达这个点,则从起点出发,到达所有点的方案有许多种.求所有方案走的总路程 ...

  7. codeforces 340A The Wall(简单数学题)

    题意:输入a,b,x,y,a,b分别是两人的步数(每a块砖,刷一次),则有一些砖被两人同时刷到了,问[x,y]区间内有多少块砖同时被两人刷到. 分析:就是求[x,y]中有多少个能把a,b的最小公倍数l ...

  8. codeforces 888A/B/C/D/E - [数学题の小合集]

    这次CF不是很难,我这种弱鸡都能在半个小时内连A四道……不过E题没想到还有这种折半+状压枚举+二分的骚操作,后面就挂G了…… A.Local Extrema 题目链接:https://cn.vjudg ...

  9. CodeForces 765 F Souvenirs 线段树

    Souvenirs 题意:给你n个数, m次询问, 对于每次一次询问, 求出询问区间内绝对值差值的最小值. 题解:先按查询的右端点从小到大sort一下,然后对于塞入一个数的时候, 就处理出所有左端点到 ...

随机推荐

  1. poj 1068 模拟

    题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...

  2. (转)Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)

    一.预备知识 LVM全称为Logical Volume Manager 逻辑卷管理器,LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘 ...

  3. 关于Unity 中对UGUI制作任务系统的编程

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  4. c#实现深拷贝的几种方法

    为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做,看代码 public cla ...

  5. asp.net core系列 69 Amazon S3 资源文件上传示例

    一.  上传示例 Install-Package AWSSDK.S3 -Version 3.3.104.10 using Amazon; using Amazon.Runtime; using Ama ...

  6. Netty学习(四)-TCP粘包和拆包

    我们都知道TCP是基于字节流的传输协议.那么数据在通信层传播其实就像河水一样并没有明显的分界线,而数据具体表示什么意思什么地方有句号什么地方有分号这个对于TCP底层来说并不清楚.应用层向TCP层发送用 ...

  7. net core Webapi基础工程搭建(一)——开发工具及环境

    目录 开发工具 版本 后端框架 开发工具 Visual Studio 2019,既然要折腾那就体验最新版的开发工具有什么特殊的地方,之前个人开发使用的是2017. 下载地址:https://visua ...

  8. MySQL MGR集群单主模式的自动搭建和自动化故障修复

    随着MySQL MGR的版本的升级以及技术成熟,在把MHA拉下神坛之后, MGR越来越成为MySQL高可用的首选方案.MGR的搭建并不算很复杂,但是有一系列手工操作步骤,为了简便MGR的搭建和故障诊断 ...

  9. springboot中oracle的依赖添加失败的解决

    由于Oracle授权问题,Maven3不提供oracle JDBC driver  步骤一:在pom中添加如下: <!--Oracle 驱动 --> <dependency> ...

  10. shiro实现session共享(本文转自店蛋蛋)

    session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...