8.13 睡觉场
调题太慢了!
复制粘贴 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)\)。于是可以得出:
由于有个除法,有关状态不会太多,所以记忆化搜索可过。
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\) 投票的数目进行转移即可。
注意这样投票位置的顺序会使方案不同,于是最后要除所有位置的乘积。