Topcoder练习
- SRM782 PaintItBlack
- SRM783 CardboardBoxes
- SRM763 ProductAndProduct
- SRM761 SortArray
- SRM784 SpeedingUpBozosort
- SRM785 TAASquares
SRM782 PaintItBlack
翻译
给定一个拥有n个顶点m条边的无向连通图。你现在位于顶点1。所有顶点的颜色初始时都是白色,当你沿着边(u,v)从u移动另外一个顶点v的时候,v的颜色会改变(从黑色变成白色,或从白色变成黑色)。现在要求找出一条从顶点1出发最后回到顶点1的回路(回路中同一条边可以走多次),要求回路的长度不超过5n,且沿着这条回路移动后,最终所有顶点的颜色都变成了黑色。输出这样一条回路或者报告无解。
题解
挺不错的题目。
问题实际上要求找到一条回路。如果仅考虑回路中的单向边,每个顶点的入度都是奇数,且回路是欧拉回路,有向图欧拉回路有解当且仅当每个顶点入度和出度相同,且图连通。
由于是无向图,那么我们可以沿着某条路径P从1移动到x,之后在原路返回到1。这样也是一条回路,注意到走过这样一条路径后,除了1和x的颜色改变,其余顶点的颜色都保持不变。同时由于图是连通的,因此我们可以利用这种方法,对于任意顶点2≤i≤n,都找到一条从1到i的路径,并原路返回,这样除了1外其余所有顶点的颜色都变成了黑色,且这样移动还能得到一条回路。
现在我们来讨论1的最终颜色,由于1的入度最终为n−1,因此如果n是偶数,那么1最终是黑色。这样就大功告成了。
现在来讨论n是奇数的情况。我们发现其实之所以n是奇数的情况下上面的策略1一定是白色,因为没走一趟,都有偶数个顶点的颜色变更,因此无论走多少趟,至少会有一个顶点的颜色保持白色。但是如果此时如果图中有长度为奇数的简单环,那么我们可以通过走这条环改变图中白色顶点数目的奇偶性,这样就有解了。
下面我们证明在其余情况下,一定无解。所谓的其余情况实际上就是n是奇数且没有奇数环,这时候我们会得到一个顶点数为奇数的二分图(L,R),其中1∈L,我们发现回路的终点一定在L,但是回到L集合的时候,路径的长度一定为偶数,换句话说,只有偶数个顶点的颜色变更,而n奇数,因此不可能所有顶点同时颜色为黑色。
至于题目要求回路长度不超过5n,我们可以生成任意一颗生成树,之后我们假如我们考虑连接父亲f和孩子c边(f,c),注意到我们会通过(f,c)从f到c的次数和从c到f次数是一样的,对于c子树内的每个顶点v,从f到v都要经过一次(f,c),因此经过(f,c)从f到c的次数等于size(c)。但是如果size(c)>2,那么说明我们从f到c和从c到f的次数超过了2,我们可以各减去2,这样不会改变任何顶点入度的奇偶性,且每个顶点的入度和出度一致,且不破坏连通性。因此每条树边的每个方向都最多在回路出现两次,这里总共有4n−4条边。之后可能还需要加入一条奇数长度的简单环,长度最多为n,因此我们要找的回路长度最多为5n−4,是满足条件的。
算法的过程,我们可以先将最终会出现在回路中的有向边提取,之后在找欧拉回路,可以用Hierholzer算法解决。
SRM783 CardboardBoxes
翻译
要求求公式2(x2+xy+xz+yz)=S的正整数解数目,其中S是给定整数,x,y,z是要赋值的未知数,且y≥x,S≤1015
题解
首先有解的前提是S是偶数,我们将公式先进行化简:
x2+xy+xz+yz=S2之后最重要的就是左部公式可以化简:
(x+y)(x+z)=S2由于(x+y)|S2。因此我们可以枚举所有S2的因子。考虑x+y=a,那么x+z=S2a。
这时候还有三个约束条件,一个是y≥x,另外一个是x≥1,最后还有z≥1。将y和x都用x代替可以得出:
{x≥1−2x+a≥0−x+S2a≥0最后可以得出x的取值范围。
SRM763 ProductAndProduct
翻译
给定n个盒子,第i个盒子中有ci个大理石。现在还有额外的m个大理石,要求这些大理石独立等概率放入到某个盒子中。记第i个盒子最终放入xi大理石,要求计算∏ni=1(ci+xi)的期望值。
题解
记N=1,…,n
我们先将∏ni=1(ci+xi)拆分开来,其等价于∑U⊆N(∏i∉Uci)(∏i∈Uxi)。
我们套入期望公式可以得到:
E[n∏i=1(ci+xi)]=E[∑U⊆N(∏i∉Uci)(∏i∈Uxi)]=∑U⊆N(∏i∉Uci)E[∏i∈Uxi]记f(i)=∑U⊆N∧|U|=i∏j∈Uci。即所有大小为i的c1,…,cn的子集的乘积和。我们可以用生成函数+多项式卷积O(n(log2n)2)时间复杂度预处理这些内容。
同时可以发现,每个盒子仅有指标不同,因此E[∏i∈Uxi]=E[∏|U|xii=1],可以代入替换为:
∑U⊆N(∏i∉Uci)E[∏i∈Uxi]=n∑k=0f(n−k)E[k∏i=1xi]E[∏ki=1xi]可以解释为所有方案下前k个元素的乘积和除上总方案数。所有方案下前k个元素的乘积和这个问题可以通过隔板法解决,具体可以参见我的另外一篇博客《组合数学》中隔板法一节中的题目1。可以简化为:
E[k∏i=1xi]=(n+m−1n+k−1)(n+m−1n−1)最后得出的公式为:
n∑k=0f(n−k)(n+m−1n+k−1)(n+m−1n−1)SRM761 SortArray
翻译
给定长度n和m个命令,判断是否对于所有长度为n的序列,执行上述m个命令后都能得到有序序列。命令从前往后执行,每个命令指定若干个位置,将这些位置的数从小到大进行重排。其中n≤15,m≤100。
题解
我们不能枚举所有的n种排列,因为数量级太大。但是我们可以这样玩,我们考虑一个长度为n的01序列,其中部分为1,部分为0。如果命令能保证对所有长度为n的序列正确排序,那么自然也能对我们的01序列进行排序。
现在我们断定如果所有可能的长度为n的二进制序列经过排序后都是有序的,那么一定能正确排序所有的长度为n的序列。用反证法,假设存在一个序列a不能被正确排序,那么考虑在对a应用m个命令后得到的新序列为b,考虑最小的数x,满足存在某个更小的数在b中排在x后面。接下来,我们将a中所有大于等于x的数改写为1,而所有小于x的数改写为0,那么经过m个命令后,得到的新序列实际上是将b中所有大于等于x的数改成1,而其余数改写为0,这样我们就发现一个长度为n的二进制序列不能被正确排序,这与前提相悖。
用这种方式做校验,时间复杂度为O(mn2n)。
SRM784 SpeedingUpBozosort
翻译
无
题解
首先置换最多为m=6!=720,因此可以用马尔可夫矩阵O(m3)求期望。
但是问题来了,由于我们随机操作会进行k=1000次,如何计算每个置换在1000次随机操作后变成各种其它置换的概率呢。这个可以想到用DP的方式,记dp(i,j)表示相同置换(123456)在i次随机操作后变成置换j的概率。对相同置换求结果概率的时间复杂度为O(mn2k)。这里也就出现了一个难点,怎么计算所有m种置换在k此操作后的概率呢?如果暴力计算,则时间复杂度为O(m2n2k),肯定过不了,但是我们发现置换之间的区别仅在于标号,如果我们将dp中用到的所有标号进行替换,就会发现O(m2n)即可得到其余所有矩阵的DP方程。
最后我们要做的就是套上马尔可夫矩阵,求出结果即可。
SRM785 TAASquares
翻译
要求找出一个n×n的矩阵,每个单元都只能为0,1,2,要求所有列和和行和的集合最大(即有最多不同的列和和行和)。
题解
答案是:
[1222012200020000]可以发现上两行和与左两列和拥有相同的奇偶性,且值不同,同理下两行和与右两列和奇偶性不同,但是值不同,因此每行每列都拥有不同的和。
上面这个答案对n是偶数的情况下,不同总和为2n,正确性是显然的,现在考虑奇数n。
[1222201222000220000200000]可以发现除了第三行和第三列的总和相同以外,其余行列都不同。因此这个构造算法给出的不同总和数为2n−1。但是这是正确的吗。我们可以证明当n是奇数的时候,所有行列和不可能都不相同。
先考虑将矩阵全部用1填充。现在我们要修改矩阵使得每行每列和都不同。我们对每行每列单独考虑修改次数,考虑到和为n的只能出现一次,因此其总有效修改次数至少为0,同理n−1和n+1也都各只能出现一次,因此这两个行列的总修改次数至少为2。对于n−2和n+2同理。因此我们推出对于所有行列总的修改次数至少为0+1+1+2+2+…+(n−1)+(n−1)+n=n2。
接下来我们假设已经得到了一个n×n的矩阵,且每行每列的和都不同。我们将所有行按行和进行排序,同时将所有列按列和进行排序。这时候我们应该恰好有n个数大于n或大于等于n。这里不失一般性我们假设为前者,假设后r行和后n−r列满足条件。现在我们来定义好坏操作,如果在前n−r行或前r列做减少操作则为好操作,在后r行后后n−r列做增加操作则为好操作。我们由上一段知道#好操作-#坏操作\geq n^2。考虑如果在前n−r行r列最多做2r(n−r)次好操作,而在后r行n−r最多做2r(n−r)次好操作,其余位置好操作和坏操作抵消。
因此我们能做的好操作的上限次数为
4r(n−r)≤n2这里等号取到的条件是r=n2。我们知道当n为奇数的时候是取不到的,因此当n是奇数时,我们不能让所有行列都不同。