The 3rd Universal Cup. Stage 1: St. Petersburg(暨 2024 LIX SPbSU Championship)部分题解
注意
题解写得可能非常抽象。
「如果一个题解你看不懂,那是题解垃圾而不是你垃圾。」
比赛链接:UCup
A. Element-Wise Comparison
题意
给定序列 ,正整数 ,统计有多少 满足:。,0.4s。
题解
bitset。先对于每个 ,统计有哪些下标 满足 ,得到 个 bitset。然后变换为统计有哪些下标差满足 。答案为连续 个 bitset 的按位与的 popcount 之和。
为了求出所有「连续 个 bitset 的按位与」,可以每 个 bitset 选一个 pivot,这样每个 bitset 段都会恰好包含一个 pivot。求 pivot 开始往前、往后一段各自的按位与,前缀后缀合并得到各个长为 的段的按位与。
总复杂度 。
C. Cherry Picking
题意
某人参加了 场比赛,第 场比赛对手 rating 为 ,结果为 (胜/负)。给定 ,求最大的 ,满足去掉所有 小于 想比赛后,剩下的比赛中,可以找到一段 连胜。。
题解
从小到大扫 ,不断删除比赛。对每场比赛,用并查集维护其所在的连胜段、并在根记录连胜段的长度(对于胜场);用双向链表维护前/后的连胜段或负场(对于负场)。同时维护段长的 multiset。于是可知每个 对应的最大连胜段长度。
D. Dwarfs' Bedtime
题意
交互题。有 个人(互相独立,下面只考虑一个)。每个人从一天的某一分钟开始睡觉,睡恰好 12 小时。你从 00:00 开始,每分钟可以去看这个人是否在睡着状态,直到当天 23:59 结束。在 次询问内求出这个人开始睡觉的时间;你的每次询问要求时间单调。
题解
现在 00:00 询问一次,可以把睡眠开始时间分为两种情况:00:01~12:00 和 12:01~23:59+00:00。二者做法基本一致,以第一种为例:先等到 00:48,询问,由此可知睡觉时间是否在 00:01~00:48;若否,再等 47 分钟、46 分钟……直到确定睡觉时间在 p 到 q 内,则从 p+12h 开始每分钟询问,直到确定睡觉时间。
E. Fake Coin and Lying Scales
题意
有一个天平和 个硬币,其中有一个假币,重量比真币轻。每次可以将一些硬币放在天平上,称重。你有 次称量机会,天平会撒谎不超过 次,最后有 次猜测机会。求最大的 ,使得你保证能够猜中,取对数并且绝对误差在 以内即通过。。
题解
(队友做的,没有过掉)
估计答案差不多是
用最大的一项估计差不多。好像还有一些细节。
G. Unusual Case
题意
给定一张 的随机生成的无向图,找出其中 个不使用重复边的哈密顿路径。
题解
有论文 告诉我们,这个边数级别的随机图可以 找到哈密顿路径。然后用论文做法一条一条找即可,找不到就从头开始。
找一条的做法如下:随机选择一个起点开始,贪心地往前随机找一个未访问的点。如果找不到,假设路径现在长成 ,尝试找到 出发连向 的边,把路径变成 。找不到就重来。
J. First Billion
题意
给定一个长为 的序列,其构造方式为:随机选 个数,其和为 ;再随机选 个数,其和为 ;将两个序列合并打乱。其中随机指从所有和为 的集合中均匀随机。求整个序列的任意一个和为 的子集。。
题解
被智商锁了。
将序列分为两半,前一半随机选取子集,选 个;后一半同理;尝试用前一半的子集和后一半的子集合并。感性理解,其从 里面随机选了 个数,大概率包含 。
K. Tasks and Bugs
签到小模拟,Python 秒了。
N. (Un)labeled graphs
题意
通信题(Run-twice)。
编码时,输入 ,输入一个 个点的图 ,你要输出一个 个点的图 。
交互库会将 的点的编号打乱为 。
解码时,输入 ,输入一个 个点的图 ,你要还原出 个点的图 。
图均为无向简单图。
题解
考虑 的构造:
- 首先保留 作为子图。将点从 开始编号。
- 取 个点,记作 。将它们串成一条链。
- 剩下三个点记作 。
- 向除了 的所有点连边。
- 向 和 连边。
- 向 和 到 连边。
- 向二进制表示中第 位为 的点连边;但是不向( 中)度数为 的点连边。
考虑解码:
- 此时可以验证, 中度数为 的点在 里度数为 ,其他所有点度数均不小于 ,唯一一个度数为 的点是 。先找到 。
- 找到所有与 不相邻的点中度数最大的,这个点是 。(如果不排除与 相邻的点, 的度数可能与 一样大)
- 注意到如果 ,那如果 这个点与 中左右其他点相邻,那么 和 的度数相同。但这没有影响,因为它们相连的都是同样的点,随便选一个作为 即可。
- 与 不相邻的点中, 已经被找到,另一个是 。
- 找到所有与 相邻的点,这些点是 到 和 。 与 到 孤立,从而可以判断出谁是 。
- 与 相邻的点中,不是 的那个就是 ,随后 到 的链可以理出来。
- 剩下的点都原本在 当中;有的点是孤立点,其编号不重要;有的点与 相连,由此可以判断原来的编号。