2017-2018 ACM-ICPC German Collegiate Programming Contest

From EOJ Wiki
Jump to navigation Jump to search

Problem A

Solved by kblack. 03:43 (+1)

题意:给三种颜色 $N$ 个点,要求搞两个不相交的多边形,使得每种颜色被隔开。

题解:上下分别开一个矩形当总线,当一列中有点需要接收时,拉一个矩形上去,分别从左侧和右侧连接(包含),与官方题解的方法 2 一致。

Problem B

Solved by ultmaster. 00:32 (+)

温暖的 Burnside 签到。

Problem C

Solved by ultmaster. 01:04 (+)

题意:非常繁琐。反正是跑一个每个点拆成 $x$ 个时间点的最短路。

题解:如题意。注意每个点可以待在上面不动(不然过不了样例)。

Problem D

Solved by kblack. 00:40 (+)

题意:给一些有向边,询问一对点之间有无偏序。

题解:$N$ 很小,Floyd 一下把所有的顺序求出来。

Problem E

Solved by zerol. 01:47 (+6)

题意:有向图判负环。

题解:用 spfa 判负环。注意对于每个点都必须访问过,即使在一个联通快里。

zerol: 我有向图建成无向图了,spfa 还写错,罚钱。

Problem F

Solved by ultmaster. 02:29 (+)

题意:二分图匹配。左边可以选一个点配右边三个点。

题解:朴素的想法就是跑完一遍匹配之后把遍历左边的点,然后依次把每个点的容量改成 3,再改回去。这样做居然是能过的。(不知道为什么)

Problem G

Solved by kblack. 00:12 (+)

温暖的皮克定理签到,签这么慢,这锅我背了。

Problem H

Solved by zerol. 04:14 (+5)

题意:树上有松鼠被两只乌鸦追。每回合乌鸦起飞并确定落点,松鼠每回合可以到树上的任意位置只要不经过那个没飞的乌鸦,然后飞起来的乌鸦落地。松鼠被乌鸦踩了或者无路可走就挂了。问乌鸦最少几步逼死松鼠。

题解 1:

四次方的 dp。注意状态的循环依赖问题。(然而没过)

题解 2:

首先发现乌鸦要逼死松鼠,从第二部开始就是交替往松鼠所在的联通块压缩活动区域。步数就是以某只乌鸦为根,松鼠所在的那一支的最大深度。但是乌鸦也可以以一步的代价改变位置,可以枚举前两步或者直接飞到重心(按深度而不是子树大小)。

Problem I

Solved by zerol. 00:23 (+)

简单 dp 签到。

Problem J

Upsolved by ultmaster.

题意:把 $n$ 个单词放进一个 $h \times w$ 的方格纸,求方案。

题解:先把一个单词包含另一个单词的情况吃掉。然后记 $f(state, i)$ 为已经用过 state 的单词,最后一个单词是 $i$,最少需要多少行,以及在行数最少的前提下最后一行又多少列。预处理单词的重叠情况后,暴力转移即可。最后求方案回溯可能略有点麻烦。

Problem K

Solved by kblack. 00:18 (+)

温暖的签到。