A:过河
贪心
每次都让蛤尽可能向后跳
每次都跑就可以了
如果用vector会T掉
set就可以A掉
还有一种O(n)算法
考虑上面的构造
如果将所有蛤一起考虑
就类似于一个滑动窗口
开一个队列
每次都让最后面的蛤跳到前面
如果跳不到前面就直接扔掉
时刻维护队列元素个数最小值
最后跳到对岸后 就是答案
B:选数
Trie树
容易看出小r的操作就是将x左移一位 如果高位溢出就在低位补全
假定小r在i时使用技能
小r的操作其实可以转化为将i之前的所有操作及初始的x都左移一位
因为位运算不会进位 所以是对的
枚举小r在什么时刻进行操作
发现操作序列只有m+1种
把操作扔到Trie树上
但是和普通Trie树不一样的地方是
这里类似于给定操作序列 求原数
考虑当前的操作序列其实是小r掌握的
即无论选多少 小r可以选择向左或者向右
所以如果在某个节点 有0 1 两个儿子
那么该节点对答案就没有贡献
因为无论选多少 小r都会使更劣的一方走
但是如果在某个节点只有一个儿子
那么只要原数是儿子的对立面
那么异或之后显然还是可以对答案造成贡献的
因此统计答案就显然了
每次到达叶子节点 记录下当前的答案
如果大于ans 就把ans更新 cnt置为1
等于ans就让cnt++