K. Hemose on the Tree
题意:给定有2的次幂个结点的树,试给每个节点和每条边赋一权值,使得对于从某指定根节点出发,到任意一结点的简单路径上权值异或和最大值最小。要求权值取遍[1, 2n-1].
解:有两个需要确定的东西:根节点、最大权值异或和,以及如何取遍[1, 2n-1]. 根据异或的性质可以感受到根节点不太重要,那么先确定最大权值。所有点取值范围在二进制下为[00001, 11111]这样的形式,通过两个良心样例可以盲猜权值异或和的最大值最小为n。稍微思考一下,最高位的1是肯定会有一个的,如果让它最小,显然后面都是0,也就是取n最理想,而样例证明了可以取到(没有样例,难度加倍)。现在考虑如何构造。顺势以n为根节点。对于任意一个数a,如果a>n,则a^(a-n)=n;a<n时同理,也就是假设n=8,可以1,9,2,10这样子成对填;这样每对之间异或值为n,n^n=0。如果都是结点的话挺麻烦的,但现在边和点都有权值,刚好形成一对一的关系,直接填就是了。好题!
L. Fair Share
题意:给出若干个长度为偶数的数列,问是否有一种方法,使得从每个数组中取出一半数组成新数组L,剩余部分组成新数组R,且L与R的元素相同。
解:又是一个和2相关的构造题,上一个和2相关的题在两两分组,这个题虽然不能这么做,但也像是乱搞一番后再分配L和R。看到L和R有一种连边的冲动,但直接和L或者R相连不能保证从每个数组中刚好取一半。试图给每个数和数组编号连边,即,如果数组a包含2和3,那么a和2,a和3各连一条边。那出现两个2怎么办呢。考虑连边的意义,我们需要每个数组有一半是出边,那还有一半肯定得是入边。重新理解一下入边,即最终形成的数组有一个元素来自a。那出现两个相同的数就连两条边。最后发现,可以将出边分配给L,入边分配给R,构造一个欧拉回路,各种意义上都符合题意,但又有点讲不清的感觉,很神秘。
M. Circular Spanning Tree
题意:给出一个01串,将这个串按顺时针排成一个圈,每个0/1代表一个点。要求拿这n个点构成一棵树,有0的点度数为偶数,1的点度数为奇数。给出连边方案,其中每条边都为直线,且两两不相交。
解:拿样例开始画,发现应该用0和1的奇偶性构造。这样一共有4种可能,每种分类讨论一下可能能出,但可以预见还要讨论1和2的特殊情况,一个构造题做成这样八成是错了。首先全是0的情况排除,全是1只能有偶数个1,突然想起来离散数学好像学过一棵树只能有偶数个奇数度的结点,很快乐。为了减少分类讨论拿一个1作根,然后把0串起来,剩下奇数个1接到0上刚好,但边会交叉,烦。考虑给1接相邻的0,最后把0串起来,那还是要讨论接奇数个1还是偶数个1。再次分析,首先0是肯定要串起来接到根节点上的,剩下的1肯定是要当叶子结点的。把相邻的0串起来,最后接一个1,分成好几段接到根节点上,这样就不会交叉了。对于剩下的1,直接接到根节点即可。