考虑暴搜所有合法的 $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这个做法,恳请帮助。