Codeforces #765D
我在这道题上花了2个小时,仍没解出。理一下当时的思路,看看症结到底在哪里。
题意
用 $[n]$ 表示集合 $\{1,2,3,\dots, n\}$ 。
3个函数
$f \colon [n] \to [n]$
$g \colon [n] \to [m]$
$h \colon [m] \to [n]$
满足下列两个性质
- $\forall x \in [m], g(h(x)) = x$
- $\forall x \in [n], h(g(x)) = f(x)$
给出 $f$ ,求 $g, h$ 。如有多解,任给一组。
分析
由性质1可知
- $g$ 是满射(surjective),$h$ 是单射(injective)
进而据性质2可知
- $g$ 和 $h$ 值域相同 $\Rightarrow$ $m$ 等于 $f$ 的不同函数值的个数。换言之,$h$ 是 $f$ 值域中元素的一个排列。
- $\forall x_1, x_2 \in [n], g(x_1) = g(x_2) \Leftrightarrow f(x_1) = f(x_2)$ 。换言之,$h$ 和 $f$ 相似。
至此可得有解的一个必要条件:
对于 $f$ 值域中的任意两不同元素 $y_1, y_2$,$f(y_1) \ne f(y_2)$ 。
遗憾的是,这个必要条件太弱了。
样例
2
2 1
满足条件,却是无解的。
思路到这里就断了。
现在回过头来想,问题的根源在于:
在 $f$ 满足上面推导出的必要条件的情况下,将 $h$ 任取为 $f$ 值域中元素的一个排列后,再求 $g$ 时,性质1和性质2仍可能互相矛盾。
那么是否需要枚举排列呢?
我没有认识到的是
不论如何求解 $g$ 和 $h$,是否有解只取决于 $f$ 本身。
所以应当进一步挖掘有解的必要条件甚至充要条件。
题解上的分析
$$
\left.
\begin{aligned}
g \circ h = \mathbf{1} \\
h \circ g = f
\end{aligned}
\right\}
\Longrightarrow
\begin{aligned}
f \circ f &= (h \circ g) \circ (h \circ g) \\
&= h \circ (g \circ h) \circ g \\
&= h \circ \mathbf{1} \circ g \\
&= h \circ g \\
&= f
\end{aligned}
$$
若 $f(x) = y$,则 $f(y)=f(f(x))=f(x)=y$ 。
即 $f$ 值域中的每个元素都是 $f$ 的不动点(fixed point)。(性质3)
这个必要条件比上面那个必要条件强得多。
下面证明
若 $f$ 满足性质3,则将 $h$ 取为 $f$ 值域中元素的任意排列,依据性质2求出的 $g$ 都满足性质1。
$g(x) = h^{-1}(f(x))$
$g(h(x)) = h^{-1}(f(h(x))) = h^{-1}(h(x)) = x$
Codeforces #765D的更多相关文章
- 【codeforces 765D】Artsem and Saunders
[题目链接]:http://codeforces.com/contest/765/problem/D [题意] 给你一个函数f(x); 要让你求2个函数g[x]和h[x],使得g[h[x]] = x对 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- github上ReadMe语法
大标题 =================================== 大标题一般显示工程名,类似html的\<h1\><br /> 你只要在标题下面跟上=====即可 ...
- POJ 1155 TELE (树形DP,树形背包)
题意:给定一棵树,n个节点,其中有m个叶子表示的是用户,其他点表示中转器, 每条边都有权值,每个用户i愿意给的钱w[i],问如果在不亏钱的情况下能为多少用户转播足球比赛? 思路: 其实就是要选出部分叶 ...
- mongo ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused
解决方法 rm /var/lib/mongodb/mongod.lock
- 油猴Tampermonkey 全局函数 它的注入函数都在 onload里面,直接写函数 都是内部函数,外部要是调用,就要挂靠到window上
油猴Tampermonkey 全局函数 它的注入函数都在 onload里面,直接写函数 都是内部函数,外部要是调用,就要挂靠到window上 window.like111 = function (){ ...
- Gradle环境下导出Swagger为PDF
更多精彩博文,欢迎访问我的个人博客 说明 我个人是一直使用Swagger作为接口文档的说明的.但是由于在一些情况下,接口文档说明需要以文件的形式交付出去,如果再重新写一份文档难免有些麻烦.于是在网上看 ...
- 【图文并茂】DEV配置NTL库
一开始根据陈老师的博客:再说如何在DEV C++中搭建NTL库 后来发现自己虽然跟着一步一步来做,还是做错了很多回. 究竟怎么一回事呢?后来我发现一个致命的错误很容易忽视,所以我就重新写一篇博客. 来 ...
- java B转换KB MB GB TB PB EB ZB
public static String readableFileSize(long size) { if (size <= 0) { return "0"; } final ...
- Active Directory网域
Active Directory网域 3.1Windows网络的管理方式 3.1.1工作组模式 工作组由一组用网络连接在一起的计算机组成,他们将计算机内的资源共享给用户访问.工作组网络也被称为“对等式 ...
- iOS 面试集锦
是第一篇: 1.Difference between shallow copy and deep copy? 浅复制和深复制的区别? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身. 深层 ...
- JS中Null与Undefined的区别--2015-06-26
在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...