8.13 睡觉场

发布时间 2023-08-13 21:39:20作者: _maze

调题太慢了!

复制粘贴 2

热身题。观察到 \(k\) 很小,考虑 \(O(nk)\) 做法。

于是我们对于 \(k\) 位中的每一位倒着考虑它的初始位置在哪里,然后做完了。

愉快的标志设计

我错了,这才是热身题。

断环为链,前缀和,暴力做。

有趣的家庭菜园 2

枚举最高点,然后左边,右边的递增递减序列用 \(dp\) 求解。

Xor Sum

蓝题,太困难了。

我们令 \((a,b)\)\(a\) 二进制的每一位都不大于 \(b\)。那么我们可以证明(实际上是打表得出)对于每一组 \((a,b)\),它与 \((u,v)\) 呈单射关系。

考虑证明:对于不相同的两组 \((a_1,b_1)\)\((a_2,b_2)\),我们查看他们的异或和 \(u_1,u_2\),如果相等,则对于不等于 \(0\)\(u_1,u_2\),必有一位 \(1\),在这一位上一组为 \((0,0)\),另一组为 \((1,1)\)。此时 \(a_1+b_1\) 必定不等于 \(a_2+b_2\)。于是我们找 \((u,v)\) 就变成了找 \((a,b)\)

现在来递推。考虑最低位,则有三种可能 \((0,0),(0,1),(1,1)\)。于是可以得出:

\[F(n) = F(n/2)+F((n - 1) / 2)+F((n - 2) / 2) \]

由于有个除法,有关状态不会太多,所以记忆化搜索可过。

ANDfinity

首先把所有 \(0\) 变成 \(1\),原因显然。

然后考虑 lowbit 最高的集合 \(A\)。如果集合 \(A\) 只有一个数,那么对这个数 \(-1\) 即可,此时会让小于其 lowbit 的位变为 \(1\),必定可以。 否则如果有两个以上的数,我们对一个 \(+1\) 一个 \(-1\)\(+1\) 是为了与其他 lowbit 最高的数保持联通,同时连边向 -1 的点。

一种特殊情况是奇数全联通,偶数全联通,这时只要把一个偶数 \(+1\)。特判一下即可。

Count Voting

组合计数题,中途想歪了一次,但是并不是很难。

直接按人来看不是很好想,不妨把人变成队伍的一部分。预处理出每个组需要的票数与拥有的人数。分别为 \(a\)\(b\)

现在我们想要求出答案,实际上就是分别递推当前队伍与前面队伍的关系。显然的想法是设 \(f_i\) 表示前 \(i\) 个队伍的票已经满足,但是这样没有办法得出前面队伍向后面投票的信息,不好转移。

于是我们设 \(f_{i,j}\) 表示前 \(i\) 个队伍票已满足,且内部向内部投了 \(j\) 票。转移时枚举向前面投票的数目,与前面向 \(i\) 投票的数目进行转移即可。

注意这样投票位置的顺序会使方案不同,于是最后要除所有位置的乘积。