XVII Open Cup named after E.V. Pankratiev. Grand Prix of Tatarstan

Contest Info

date: 2017.11.02 15:50-20:50

practice link - 10374

Solutions

D. Clones and Treasures

签到题

E. Space Tourists

题目大意 :在外太空有 \(K^2\) 个站点,每个站点的编号是一个 \(2\)\(K\) 进制数。每个旅行者有一个唯一的 ID(一个 \(N\)\(K\) 进制数),一个旅行者可以被安排到一个站点,当且仅当该站点的编号是旅行者 ID 的子序列。现在问最少保留多少个站点,可以使得每个旅行者都可以被安排到至少一个站点。

题解 :如果 \(N > K\) ,那么答案显然为 \(K\) 。我们只需要选形如 \(00,11,...,(K-1)(K-1)\) 的站点,由鸽巢原理可以知道,\(N\)\(K\) 进制数中一定有两个相同的位,于是一定存在一个站点可以分配过去。

如果 \(N\leq K\) ,那么我们应当将 \(K\) 种数字,尽可能平均地分为 \(N-1\) 块。那么同样由鸽巢原理,旅行者的 ID 中至少有两位会处于同一块中。我们只需要将每块内部的任意两两数字的排列选出,再加上 \(K\)\(00,11,...,(K-1)(K-1)\) 的站点,就可以满足题目要求了。

J. Terminal

题目大意 :来自 \(m\) 个队伍的 \(n\) 名程序员在等候乘车。现在只有两辆车,每辆车可以乘坐至多 \(K\) 个人。现在你要给每个人指定一辆车乘坐,满足如下要求:

  • \(n\) 名程序员已经形成了一个队列,他们的顺序不可以交换。
  • 每一秒钟队首的程序员会前往他被指定的车,当一辆车指定的程序员都上车之后,该车会立即出发。
  • 同一个队伍的程序员必须上同一辆车。

问你是否此问题是否有解,如果有解,给出最少的每人等待时间之和。每个人的等待时间定义为从初始时刻,到他被指定的那一辆车出发的时刻。

题解 :显然被指定到最后一个人所在车的程序员的等待时间是确定的,也即序列长度 \(n\)。 我们考虑枚举另一辆车的出发时间,我们需要尽可能地往这辆车里面塞人。考虑到同一个队伍的程序员必须上同一辆车,所以我们将每个队伍按照最后一个人的出现位置排序,然后做一个背包。每次做完背包之后,找到在区间 \([n-K,K]\) 中最大的装载人数,然后更新答案。

背包可以用 bitset 优化,复杂度为 \(\mathcal{O}(\frac{mK}{32}+mK)\) ,第二部分的常数比较小,可以通过。