牛客挑战赛 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\) 的元素操作成

\[111...1c_{i - 1}\dots c_{1}c_{0} \]

其它元素操作成

\[000...0c_{i - 1}\dots c_{1}c_{0} \]

于是答案的第 \(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\) 固定时的贡献为

\[\sum_{a = r - i + 1}^{n - i + 1} (2^{x})^{l} \cdot x \cdot i \]

\[S_{n} = \sum_{k = 1}^{n} (2^{x})^{k} \cdot x \cdot k \]

那么我们要求出 \(S_{n}\) 的封闭形式。求和式中有两项相乘:\((2^{x})^{k}\)\(x \cdot k\)。把 \((2^{x})^{k}\) 看作公比为 \(2^{x}\) 的等比数列,\(x \cdot k\) 看作等差数列,那么 \(S_{n}\) 可以看作“等差乘等比”的形式,可以套路地使用错位相减法求出封闭形式。

具体地,

\[(2^{x} - 1)S_{n} = (2^{x})^{n + 1} \cdot (nx) - x \sum_{i = 1}^{n} (2^{x})^{i} \]

\[A_{n} = \sum_{i = 1}^{n} (2^{x})^{i} \]

这是简单的等比数列求和。于是

\[S_{n} = \dfrac{(2^{x})^{n + 1} \cdot (nx) - xA_{n}}{2^{x} - 1} \]

这样就做完了。时间复杂度 \(O(n \log p)\),其中 \(p\) 是模数,\(O(\log p)\) 是快速幂的时间复杂度。

代码

posted @ 2025-06-28 13:02  DengStar  阅读(63)  评论(0)    收藏  举报