虽然此题有 k≤7 但是我愣是没看见,考场上写成了三维偏序然后重载运算符的时候很光荣地写炸了……
首先观察到 n≤34,并且有 217 是 105 级别的,这个是数据结构题非常常见的数据范围啊!
出在我们的模拟赛里让我热血沸腾(要 素 察 觉
考虑折半搜索即 Meet in the Middle(都这个范围了不 MITM 大法还怎么活?
即,对于前 n2 个我们做一次搜索,后 n2 个我们也做一次搜索,然后合并答案。
既然 k≤7 那么可以取补集之后按照选的节目数分类讨论变成二维偏序,不过写都写了不如硬核一点?
我们把每次搜索的结果都记为一个三元组 (x,y,z),其中 x 表示 A 的总得分 - B 的总得分,y 表示 A 的总得分 - C 的总得分,z 表示选择的节目数。
那么我们的要求是最后 x,y>0,z≥k。
也就是说,如果在第一次搜索里有一个三元组 (x1,y1,z1),第二次搜索里有另一个三元组 (x2,y2,z2),那么如果 x1+x2,y1+y2>0,z1+z2≥k,这两个结果就可以合并为一个合法方案。
看到不等式要学会移项,得 x1>−x2,y1>−y2,z1>k−z2,即对于第二次搜索里的每一个三元组,求出第一次搜索里有多少个三元组满足上述条件。
然后就是一个三维偏序了。
十分经典,不会的出门左转陌上花开。
树套树跑路,然鹅考场上排序的顺序写错了……
代码:
1 |
|