incent's blog

Blogs

THUPC2026初赛 K 题 的一种[maybe linear]做法

2025-12-14 21:15:47 By incent

考虑暴搜所有合法的 $C$ 集合。以下是一种可行的搜索方式:

记录搜索状态为 $(C_A,C_B,|C|)$,表示搜索树上当前节点所代表的 $C$ 集合中,(最后一个 $A$ 中的元素,最后一个 $B$ 中的元素,$C$ 的大小)构成的三元组,其中 “最后一个” 即 值最大的元素。

进行进一步搜索时,只需要选择

  • 向当前 $C$ 集合贪心加入一个 $A$ 或 $B$ 中的元素
  • 向当前 $C$ 集合贪心加入一个 $A\cap B$ 中的元素

这两种扩展方式中的一种。起始点为 $(C_A=0,C_B=0,|C|=1)$,终止条件为 $C_A=C_B=L$。

考虑进行如下剪枝:对于 $|C|$ 相同的三元组,只需要保留 $C_A,C_B$ 的类似单调栈结构。此做法通过了 qoj 的全部数据,最大状态数为 2e6+35

我并不能分析清楚/hack这个做法,恳请帮助。

Comments

qiuzx
令 $A$ 最后一个位置为 $i$,$B$ 最后一个位置为 $j$,不妨 $i>j$,记 $f_{i,j}$ 为最小代价(即搜索中的 $|C|$)。则一个状态 $(i,j,f_{i,j})$ 会被访问到,必须满足 $nxt_j>i$(否则上一步不会跳 $i$,而是应该跳 $j$)。且对于一个 $i$,在所有这样的 $j$ 中只有 $f_{i,j}$ 最小的一个 $j$(如有多个取 $j$ 最大的)会被访问到,因为其它状态都在某一维被这个状态偏序了。所以是线性的。 这样其实也不用搜索,直接记 $f_i$ 表示 $i$ 对应的最优的状态 $(j,f_{i,j})$ 做这个 dp 即可,也是线性的。
  • 2025-12-14 21:38:05
  • Reply

Post a comment

You can refer to mike by using "@mike", and "mike" will be highlighted. If you want to type the character "@", please use "@@" instead.

You can enter "/kel" to use the emoticon "kel".