ICPC North Central NA Contest 2020
兰州大学版题解
2021.08.12
A. LogDB
给定一组类似于函数调用的 和一组查询,根据指定的匹配规则确定每个查询可以匹配多少 ,需要注意数据的读入与处理。
每个 都有一个名称,并包含若干变量,每次查询也有一个名称包含若干变量,当且仅当查询的名称与 名称相同,且两者包含的变量全部成功匹配时,两者才能算成功匹配。
变量的匹配规则如下:
- 变量 "_" 可以匹配 中任意名称的变量。
- 以 "_" 开头且长度大于 的变量也可以匹配 中任意名称的变量,但是如果在一次查询中该变量出现超过一次,那么其必须匹配 中名称相同的变量。
- 其余情况下,只能匹配名称完全相同的变量。
例如,如下输入:
test(arg1, arg1) test(arg1, arg2) test(__arg2, __arg2) test(__arg1, __arg2) test2(_, __) test(_, __) test(_, __)
相应输出为:
1 2 0 2 2
对于每次查询,暴力枚举所有 ,逐一判断是否能够成功匹配。
时间复杂度 ,可以进行字符串 ,将时间复杂度降至 。
B. Ride-Hailing
给定一个 个点, 条边的有向图,同时给出图上的若干条“出租车线路”,第 条线路由从 时刻出发,从 到达 ,现在询问最少要多少出租车司机就可以完成所有线路。
我们可以以 的代价求出两两点之间的最短路。在这样的情况下,我们可以得知一名司机如果接下了第 个任务,最早能在哪个时刻到达 完成任务。接下来以 的时间两两枚举,我们也能知道一名司机在接下了第 个任务后,来不来得及去做第 个任务。
我们把任务之间的关系表示成一张有向图 。 向 有边当且仅当完成第项任务后,可以接着去完成第 个任务。可以发现,我们要求的答案就是“在这张图里,最少用多少条链可以覆盖所有的点”,也就是最小链覆盖问题。
完成最小链覆盖问题可以用二分图匹配。注意到有向图 中每有一条边被链覆盖,总链数就少了 。同时注意到,一个点最多只有一条出边与入边被链覆盖。于是我们构造二分图,将每个点拆成出点与入点,出点与入点各自构成一个集合。对于 中一条 向 的边,就让 的出点连向 的入点。这样情况下,每一种二分图的匹配方案就对应了一种链覆盖方案,并且可以发现,最小链覆盖 二分图最大匹配数。
求出二分图最大匹配可以用 最大流算法,复杂度 .
时间复杂度 。
C. Redundant Binary Notation
给定两个数 ,将十进制数 转化为二进制数,且二进制数的每一位范围从传统的 变为 ,求合法转化的不同方案数。
考虑进行 ,定义 表示用 位去构成数字 的方案数,那么有 ,可以考虑进行记忆化搜索,最后的答案即为 。
时间复杂度 。
D. Substring Characters
对于一个字符串 ,找出所有不同的最短连续子串,其中任一子串都完整包含 所包含的所有字符。
注意,连续子串不能是原字符串 自身。
例如 104001144
,共有三种这样的子串 104
,4001
,0114
。而 1040
或 04001
都不可以,因为它们不是各自位置最短的。
注意到字符串长度最多只有 ,字符集大小只有 。
对于每个左端点 ,暴力找到满足条件的最小右端点 ,使得子串 能够完整包含 所包含的所有字符,由于 ,因此复杂度为 。
如果 存在且 ,则 就是一种答案,注意其不能是原字符串 自身,且相同的子串只计算一次。
单次时间复杂度 ,总时间复杂度 。
E. Curve Speed
按要求计算 ,四舍五入取整,需要注意数据的读入。
单次时间复杂度 ,总时间复杂度 。
F. Agamemnon’s Odyssey
给定一棵 个点的带边权树,可以任选一点作为起点,每条边最多经过 次,但只有在首次经过时才会贡献大小等于边权的价值,求价值和最大的一条路径。
不难发现,当 时,每条边都可以访问到,最大价值和为整棵树的边权和。
当 时,相当于求树的直径,可以使用两次 或者树形 等方法。
时间复杂度 。
G. Safest Taxi
给定了一个 条纵线, 条横线组成的方格网络,方格中的每一条边都是一条路,题目给定其中的 条路,每条路都有双向道,每个道有 个车道。要求在题目规定的车辆行驶准则下,一辆车从给定的起点到终点,用不多余 次左转和不多于 次的变道可以实现的最短路。
发现 其实都很小,而题目所求的是起点到终点的最短路,因此考虑分层图最短路(基于状态图的最短路)。结合题目所要求的的条件,可以找出以下几个条件来规定点的状态:所处街道,所面向方向(双向车道的哪一车道),所在车道(共 条),已经使用的左转次数 ,已经使用的变道次数 。这样建图的点数量级是 ,也即 的状态,边数略多一点。按照题目中的给定条件建完边跑最短路即可。
时间复杂度 。
H. Digital Speedometer
给出一个浮点数序列,按要求进行取整,需要注意数据的读入。
若当前的数为 ,取 ,使得 ,按照如下规则对 进行取整,得到 :
,那么 。
,那么 。
,那么 。
,那么 。
,若 比上一个 小,那么新的 ,否则 。
时间复杂度 。
I. Staggering to the Finish
给出一个椭圆形跑步场地的各种参数,在不同的跑步距离 下,求出各跑道运动员的起点位置,使得所有运动员沿自己的跑道到终点,运动的路程都等于 。
很容易理解的计算几何问题,不过实现起来并不容易,细节较多。
预先计算出每条跑道的弯道长度,从终点开始反方向(顺时针)推导出起点落在弯道还是直道。
如果落在直道,很容易直接得出结果;如果落在弯道,需要借助弧长公式 ,求出对应圆心角 ,然后得出其相对于圆心的坐标,进而得出结果。
时间复杂度 。
J. Ada Loveslaces
在一个二维平面上有 个洞,分为两排。两排间隔为 ,同一排中相邻两洞的距离为 ,每个洞的深度为 。给定一条鞋带,长度为 ,要求确定符合题目穿线规定的穿完点后线头所剩余长度在 范围之间的穿线方案数。
因为从洞 出来的鞋带必须进入 (或者可以看作洞 出来必须进入洞 ),并且鞋带一定从 两个洞穿出,此外,题目还要求穿线需要对称。因此我们可以只考虑某一边,另一边视为对称即可。
发现 范围很小,所有洞的经过顺序方案数一共也只有 个,同时算上各个穿孔的方式,总的方案数上限也只有 ,当 开满到 时,这个数也只有 而已,完全可以爆搜。所以直接暴力遍历所有可能方式,然后统计有串到最后一个洞所需的鞋带长度。对于询问处理一下长度在 区间内的方案数即可。
单次时间复杂度 ,但不会跑满,复杂度远小于预期。
K. ICPC Record Matching
给出两张表,用空行分割。每张表中包含若干条信息,每条信息包含名字、姓氏、邮箱,需要注意数据的读入。
现在需要找出两张表之间无法匹配的信息,然后按要求输出。
一条信息无法匹配当且仅当在另一张表中不存在至少满足如下要求之一的信息(忽略大小写):
- 名字和姓氏对应相同
- 邮箱相同
例如 Freya Campbell Freya_Campbell9926@ubusive.com
和 freya Campbell campbellf@deavo.net
可以成功匹配,因为名字和姓氏对应相同。
又例如 Danny West Danny_West6110@twipet.com
和 Daniel West Danny_West6110@twipet.com
可以成功匹配,因为邮箱相同。
这样,对于一张表中的每条信息,在另一张表中进行查询即可。
暴力时间复杂度 ,可以进行字符串 并使用 容器优化存储与查询,将时间复杂度降至 。
L. Codenames
给出桌游“Codenames”的玩法:
- 玩家分为两队,有 张牌和 个线索,这 张牌各属于一个线索中。
- 这 张牌有 种类别:清白者,红队特工,蓝队特工,刺客。
- 双方轮流操作。每个回合,行动方选定一个线索与次数 ,重复 次从该线索中选出一张牌,每次进行以下判断:
如果选中刺客,游戏结束,行动方输掉游戏。 如果选中己方特工,继续下一次选取取。 如果选中对方特工或清白者,直接结束这一回合,轮到对方行动。
当有一方特工被全部选出后,该方获胜。
现在询问,如果双方都采取最优策略,谁会获胜。
我们考虑设计一个状压 状态。 表示在剩余牌的状压状态为 ,目前行动方为 ,选取了线索,准备选取次时的获胜概率。另外同样设计一个 , 表示在剩余牌的状压状态为S,目前行动方为 时,该方最优状态下的获胜概率。
转移 时枚举选的是线索 中的哪一张牌,当 等于零或者未选中己方特工时直接从 转移( 表示选取该牌后的状态),剩余情况从 转移。转移 时直接枚举选择的线索 与选择的次数 ,从对应的 中选取一个最大值。
的总状态数为 ,每种状态转移方案为 , 总状态数为 ,每种状态转移方案为 。总复杂度 ,在该数据范围下大概为 ,考虑这题的时限与不满的状态数,可以通过。
注意 的状态转移不太好写,建议使用记忆化搜索。