小 R 有 n 个非负整数 a_1, a_2, \cdots, a_n。
小 X 给了小 R 一个正整数 m,并要求小 R 从这 n 个非负整数中选出恰好 m 个,使得选出的 m 个数的二进制按位与的值最大。
你需要帮助小 R 求出,他能选出的 m 个数的按位与的最大值。
输入的第一行包含两个正整数 n, m。
输入的第二行包含 n 个非负整数 a_1, a_2, \cdots, a_n,依次表示小 R 的 n 个非负整数。
输出一行一个非负整数,表示小 R 能选出的 m 个数的按位与的最大值。
4 2 3 15 12 12
12
5 3 31 3 1 15 7
7
样例 1 解释:可选的四对分别是 3 \& 15 = 3、3 \& 12 = 0、15 \& 12 = 12、12 \& 12 = 12,最大值是 12。
样例 2 解释:选 31, 15, 7 时按位与为 31 \& 15 \& 7 = 7,可以证明这是最大的。
数据范围
• 1 \le m \le n \le 2 \times 10^5;
• 0 \le a_i < 2^{30}。
测试点构成(共 20 个测试点)
| 测试点 | 特征 |
|---|---|
| 1 ~ 5 | n \le 20,a_i < 2^{20},可以暴力枚举子集 |
| 6, 7 | n = 2000,分别是 m = 1 和 m = n,用来卡特殊写法 |
| 8 ~ 10 | n = 2000,m = 2 |
| 11, 12 | n = 2 \times 10^5,m = n - 1(只丢掉一个数) |
| 13 | n = 2 \times 10^5,所有 a_i 形如 2^k - 1 |
| 14, 15 | n = 2^{17},a_i = i - 1(即 0, 1, 2, \cdots, n-1) |
| 16, 17 | n = 2 \times 10^5,a_i < 4 |
| 18, 19 | n = 2 \times 10^5,a_i < 2^{10} |
| 20 | n = 2 \times 10^5,a_i < 2^{30} |
提示
先想一个判定问题:「能不能让答案的二进制里包含某个掩码 M 的所有位?」这等价于「至少存在 m 个数 x 满足 (x \& M) = M」,也就是统计这样的数有多少个,若不少于 m 就说明 M 里的位可以同时为 1。
于是从高位到低位逐位确定:已经确定的答案记为 ans,试着把第 b 位置成 1,令 M = ans \,|\, 2^b,统计 (a_i \& M) = M 的个数;若不少于 m 就保留这一位。因为高位的权重大于所有低位之和,按位贪心是正确的。
复杂度 O(30n),30 \times 2 \times 10^5 = 6 \times 10^6,很快。