牛客挑战赛 80 做题记录
牛客挑战赛 80 做题记录
A. 辞书
简单题。
B. 汉堡猫猫
讲一个和官方题解不太一样的做法。
一开始套路地想到从高位到低位贪心,即尽可能让高位为 \(1\),如果能使得某一位为 \(1\),在确保这一位为 \(1\) 的情况下继续向低位贪心。但这是不太好做的,因为在处理低位时,很难保证高位为 \(1\)。
观察样例发现,如果序列中恰有奇数个奇数,那么答案为 \(2^{61} - 1\),也就是可以让答案的所有位都是 \(1\)。因为我们可以让奇数都变成 \(2^{61} - 1\),偶数都变成 \(0\),这样异或和就是 \(2^{61} - 1\)。
如果奇数的个数是偶数呢?由于最低位不能被修改,所以答案的最低位只能是 \(0\)。那么我们可以把所有数的最低位删掉,递归处理下一位。一般地,如果对于所有 \(0 \le j < i\),序列中恰有偶数个元素的第 \(j\) 位是 \(1\),而有奇数个元素的第 \(i\) 位是 \(1\),那么答案的第 \(0 \sim i - 1\) 位只能是 \(0\),而我们可以把那些第 \(i\) 位是 \(1\) 的元素操作成
其它元素操作成
于是答案的第 \(0 \sim i - 1\) 位是 \(0\),而 \(i \sim 60\) 位是 \(1\)。
还需要考虑一种情况:序列中第 \(i\) 为是 \(1\) 的元素数量为偶数,但可以调整为奇数。这需要存在某个元素的第 \((i - 1)\) 位和第 \(i\) 位不同。
最后特判一下序列全是 \(0\) 的情况即可。时间复杂度 \(O(nw)\)。
C. 区间Mex(Easy varsion)
赛时烂完了,草。不知道当时在想什么,感觉像是睡觉了。
套路地枚举 \(\operatorname{mex}\)。记包含 \(1\) 到 \(x - 1\) 的极小区间为 \([l, r]\),记 \(x\) 在排列中的下标为 \(p\),如果 \(l \le x \le r\),则不存在 \(\operatorname{mex} = x\) 的区间。否则设 \(x < l\),另一种情况是对称的。
考虑枚举左端点 \(p < i \le l\),对于一个左端点 \(i\) 统计所有合法右端点 \(r \le j \le n\) 的贡献。(如果 \(x > r\) 则枚举右端点,容易证明枚举左/右端点的总时间复杂度为 \(O(n)\),因为每次枚举端点都会扩展区间 \([l, r]\)。)记 \(a\) 表示区间长度,则 \(i\) 固定时的贡献为
记
那么我们要求出 \(S_{n}\) 的封闭形式。求和式中有两项相乘:\((2^{x})^{k}\) 和 \(x \cdot k\)。把 \((2^{x})^{k}\) 看作公比为 \(2^{x}\) 的等比数列,\(x \cdot k\) 看作等差数列,那么 \(S_{n}\) 可以看作“等差乘等比”的形式,可以套路地使用错位相减法求出封闭形式。
具体地,
记
这是简单的等比数列求和。于是
这样就做完了。时间复杂度 \(O(n \log p)\),其中 \(p\) 是模数,\(O(\log p)\) 是快速幂的时间复杂度。

浙公网安备 33010602011771号