A 组

A1

给出,问是否存在三个的排列使得

如果有解,给出构造。

是偶数时,左边的和是,右边的和是,不同余,因此无解。

是奇数时,令都是即可。

A2

给出一个个点的无向完全图,从中找出尽量多的不交的三元环。

的边数是的倍数,因此猜测是可以取完所有边的。

我们考虑对每条边,找到它所属的三元环。

如果将边按照分类,会有冲突。

将边按照分类即可(假设点的编号是)。

取出所有的三元环即可。

任意两个三元环互不冲突是显然的。

如果,则一定有,这也显然。

因此我们可以取完所有三元环,且这些三元环互不冲突,且没有不合法的情况。

A3

一个个点的无向完全图,你需要把这些边分成组,每组条边,且每组都是一个匹配。

考虑按照模数分类。

先不考虑与点相邻的边,我们将边按照分类。

容易发现每个类都是一个条边的匹配。

对于的类,我们给他分配这条边,其中即可。

A4

一个个点的完全图,你需要从中选出尽量多的不交的个点的树。

考虑是偶数的情况。上界是个树。

考虑序列。则条边构成一条链,也就是树。

容易发现)构成的树是不相交的。因此我们构造出了达到上界的方案。

考虑是奇数的情况。上界是

则我们先对前个点按偶数的方式构造,然后让每个连一条边到即可。

B 组

B1

NFLSPC #3 G

平面上有个不三点共线蓝色的点,你需要加上个红色的点,使得任意三个蓝点组成的三角形内部都必须至少有一个红点。注意红点必须在三角形内部,不能在边上。

你需要最小化的大小。

考虑答案的下界。

考虑这个个点构成的凸包,假设凸包上点数是。对这个点三角剖分,会有个互不相交的三角形。这是因为,把凸包三角剖分有个三角形,而在凸包内每加一个点,就会多个三角形,所以总数是

三角形内角和是平角。

考虑把整个平面随机旋转一个角度,使得任意两个蓝点的连线都不水平。对于每个蓝点,我们在的位置各放一个红点。是一个极小的值。

根据抽屉原理,三角形三个角平移一下可以拼成平角。因此每个三角形里都有至少一个红点,构造是合法的。这个构造用了个红点。

容易发现,凸包外面的红点是没用,这部分红点有个(最高的点和最低的点左右两边的红点都是没用的)。去掉它们,刚好达到下界。因此这是最优构造。

B2

给定一个的排列,你需要从中选出一个长度为的子序列使得子序列中第和第大的数相邻。

试构造出一个子序列,或说明不可能。

把序列分成段,每段个数。

设第段的最小值和次小值分别是

每次我们找到最小的段,然后取出,然后删除这一段,然后把其他段的数删除。容易发现,其他段最多被删掉一个数。

次得到一个长度为的序列,即可。

B3

有个的棋盘,有个红格子和个蓝格子。保证棋盘的左上角是红色,右下角是蓝色。你需要把蓝色格点中心两两连出一个向量,红色格子中心两两连出一个向量,你需要让这些向量之和为

是奇数时,分别连欧拉回路即可,或者分解为几个环也行。

是偶数时,去掉棋盘左上角的红色和右下角的蓝色,可以按照偶数的方法做。然后把所有红点连一个向量到左上角,蓝点连一个向量到右下角即可。

证明:交换两个红蓝格子(不是左上角或者右下角的),向量和不变。

B4

给定一个环,环上每个点是三种颜色(RGB)之一,若一个点左右两边点的颜色不一样,你就可以任意改变这个点的颜色。

问能否在次操作内,把一个环变成另一个。如果能,给出构造。

首先注意到,本题操作可逆。

如果这个环一个修改都做不了,那就是 trival 情况。

否则我们可以想办法把这个环变成:任意两个距离为的点异色的环。

然后让两个环走到中间状态就行。

C 组

Robot Arms

规定一个机械臂是段臂,第段长度为。其中一端连在的位置。机械臂只允许平行于坐标轴(上下左右)放置。

二维平面给你个点。要求你构造一个的机械臂(长度自定),使得机械臂的另一端可以通过恰当的放置来分别落在这个点上(个方案)。要求给出构造方案,以及落在这个点上的方案。

如果的奇偶性都一样,才可能有解。

容易想到二进制构造。设,则可以归纳法证明,满足的点都可以落到。

如果,需要在开头加一段长度为的臂。

至于落在一个点上的方案,可以递归构造。

时间复杂度很小。

代码

Not Same

大小为的序列,满足。每次你可以选择一个子集的元素并且把这个子集的元素都,你需要在至多次操作之内把所有数变成。每次选择的子集不能相同。

按降序排序,考虑这样构造:

image-20200325135405524

复杂度

Inverse of Rows and Columns

给定一个矩阵,你可以选择任意行翻转、任意列翻转。问能否使得变成非降序列。

特判的情况。

容易发现,我们最终的方案,要么第一行全 0,要么最后一行全 1。而这样就可以确定列的选择。然后再判一下选择行是否有解即可。

时间复杂度

代码

Construct the Binary Tree

给定,构造一个个点的二叉树,满足所有节点的深度之和等于组询问。

先考虑构造一棵完全二叉树。然后我们每次让总深度加 1。

方法很简单。固定一条最长的链。 每次选择一个深度最深不在链上的点,把它往下移一个位置,或者接在链上在往下移一个位置即可。合理安排顺序以避免 3 叉的情况。

时间复杂度

代码

Skolem XOR Tree

给定,构造一棵个节点的树,其中点权,要求路径上所有点权的异或和恰好是(包含端点)。

如果则无解。

考虑到,因此我们想办法围着构造菊花。对于,我们构造

的链。这样的条件就同时满足了。

对于的条件,则构造即可。

这样对于的奇数的情况是适用的。对于是偶数的情况,我们要再加一对的点进去。

那么我们找到的两个数(可以证明一定存在),然后构造即可。

时间复杂度

代码