Max Correct Set

证明 周期

改成从中选择数也是等价的。

本题的难点在于证明:存在一种最优解使得其周期为

有了这个就可以写一个状圧 DP:表示考虑在中选一个合法的集合,其中最后的个数的选择状态是的最优解。

表示的数的个数。用这个辅助 DP 的转移即可。

代码

Neko Rules the Catniverse

状圧 矩阵乘法

不妨把条件改成

表示考虑了,序列长度为,且的使用状态是的方案数。

每次转移要么不选,要么把放到序列末尾,要么放到某个数的前面()。

然后使用矩阵乘法优化静态转移即可。

时间复杂度

代码

The Celebration of Rabbits

FWT

由于序列长度是奇数,因此对于一个序列最多有使得其异或和为。因此我们可以枚举,把值域变成。这样问题就转化成个数异或和为的方案数。直接 FWT 即可。

做这题的时候这 OJ 好像出问题了。不保证代码正确性。

代码

Bank Security Unification

DP 缩减状态

我们用表示题目中的序列。

朴素的 DP 是设表示前个数的答案。暴力转移的复杂度是的。

考虑缩减状态。设表示的最高位。那么对于以结尾的最优解,一定不存在,使得。否则我可以把加进来使得答案更大。

根据上述发现,我们可以设表示最大的使得的第位为。那么对于只需要考虑所有的作为转移即可。

时间复杂度

代码

随机二分图

容斥 状态压缩

如果只有的边,那么容易想到表示左右点集的选择情况,直接跑一个状圧 DP。状态空间大小是的(因为限定)。不过很多状态是跑不到的,因为 DP 转移时我们会强制边的某个端点处在 lowbit 的位置。

对于的边,由于无法做类似 2-SAT 计数一样的东西,那么考虑容斥。如果我们直接把它拆成两条的边,那么可以发现原本的概率变成了。于是我们要补个上去。方法是加入一条“边”连接了,出现的概率是

对于的边同理,只不过概率是

代码

守卫

区间 DP

(JXOI 2018)

本题思路容易受误导。实际上与凸包、单调栈等是没有关系的。

考虑区间,我们必然会在上放一个守卫。那么设这个守卫看到的位置依次是。分析一下满足怎样的性质。

首先,,即两点连线的斜率肯定是单调递增的。

其次,对于非空区间只有可能看到其中的一些亭子。

简要证明:如果)能看到其中的一些亭子,那么又能看到,则也能看到其中的数,矛盾。

换言之独立了。即我们划分出了一个子问题

这样就可以区间 DP 了。设表示区间的答案。

中能看见的下标最小的亭子是。划分出最靠左的区间作为子问题,那么

可以理解为:在或者上放一个守卫,取最小值。

时间复杂度

代码