CF2002H
令 n 为网格的规模。我们需要寻找一条从 (1,1) 到 (n,n) 的路径,路径长度恒为 2n−2。
由于路径总边数为 2n−2,答案的上界显然为 2n−2。注意到网格图有拓扑对称性,考虑 meet-in-mid。
定义副对角线所在的位置集合为 S={(r,c)∣r+c−1=n}。因为是网格图,所以任何合法路径必然恰好经过 S 中的某一个节点。
对于 S 中的任意节点 (r,c),令 Fr,c 表示从 (1,1) 到 (r,c) 的所有前向路径构成的边权状压位集合,Br,c 表示从 (n,n) 逆推至 (r,c) 的所有后向路径构成的边权状压位集合。由于步数限制,Fr,c 与 Br,c 的基数上限为 (n−12n−2)=48620。
对于固定的交点,在 F 和 B 中各取一个元素 f,b,判断其并集 f∪b 的 MEX 是否能达到某一目标值 K。
满足 MEX 至少为 K 的充要条件是并集包含 {0,1,…,K−1} 对应的所有位。定义全 1 掩码 UK=2K−1。条件可以表示为:
f∪b⊇UK
考虑通过集合求补将其转化为对后向集合的查询:
b⊇UK∖f⟺b⊇(∼f)∩UK
令查询掩码 ReqK(f)=(∼f)∩UK。
现在考虑一个全新的问题:是否存在 b∈B,使得 b 是 ReqK(f) 的超集。
很典的做法是将 B 中的所有状态构建为一棵深度为 2n−2 的 01Trie 上面。
我们在 Trie 的每个节点 u 额外维护一个状态 sub_oru,表示以 u 为根的子树中所有掩码的按位或。
当我们在 Trie 上递归查询 Req 是否存在超集时,若满足 (sub_oru & Req)=Req 说明即使把当前子树内所有的状态取并集,也无法凑齐 Req 中需要的二进制位,这部分是绝对不存在合法解的,直接扔了。剩下的就是维护已知的最大 MEX 答案,记为 ans,考虑按照 popcount 降序验证。时间复杂度我不会证,但应该是对的。
2024 ICPC Asia East Online (I) E. Random Dungeon
令 N 为地下城的变化总数。我们需要寻找一个最优停止策略,每次挑战成本恒为 C。
由于每次是从未出现的集合中等概率随机抽取,感觉正着不好做所以考虑倒着做。
定义 Em 为当剩余卡池里还有 m 个关卡时,继续参与游戏的最优期望收益。如果在这一步抽到了分数 x,面临的决策是:收手拿 x,或者放弃当前分数,花费 C 继续抽并获得期望 Em−1。显然,只有当 x≥Em−1 时我们才会停止。注意到当卡池中还剩 m 个关卡时,这 m 个关卡必定恰好是原数组 A 中最大的 m 个。
对于序列,令 A 按降序排列,即 A1≥A2≥⋯≥AN。当 m=1 时,别无选择,必定拿到最大的 A1,故 E1=A1−C。
对于一般的 m,由于剩余的 m 个数正是前 m 大的元素,等概率抽取下的转移方程可以表示为:
Em=m1i=1∑mmax(Ai,Em−1)−C
改成前缀查询的形式:
Ai≥Em−1⟺max(Ai,Em−1)=Ai
令查询分界点为 k,满足 Ak≥Em−1>Ak+1,因为 A 是单调递减的,所以做完了。
我们在预处理时额外维护一个前缀和数组 prefi=∑j=1iAj,表示前 i 大的元素之和。
当我们在递推求 Em 时,由于只能在前 m 个元素中抽取,有效的界限为 k′=min(k,m)。说明前 k′ 个元素直接取自身的值,剩下的 m−k′ 个元素无法超越期望,统统取 Em−1。这部分直接通过 prefk′+(m−k′)×Em−1 算,时间复杂度是单 log 的。