CF1288D
题目描述
给定 \(n\) 个数组 \(a_1, a_2, \ldots, a_n\),每个数组恰好包含 \(m\) 个整数。我们用 \(a_{x, y}\) 表示第 \(x\) 个数组的第 \(y\) 个元素。
你需要选择两个数组 \(a_i\) 和 \(a_j\)(\(1 \le i, j \le n\),允许 \(i = j\))。之后,你将得到一个新的数组 \(b\),它包含 \(m\) 个整数,对于每个 \(k \in [1, m]\),有 \(b_k = \max(a_{i, k}, a_{j, k})\)。
你的目标是选择 \(i\) 和 \(j\),使得 \(\min\limits_{k=1}^{m} b_k\) 的值尽可能大。
\(1 \le n \le 3 \cdot 10^5\),\(1 \le m \le 8\)
正解
求最小值最大,一定是二分,发现 m 很小,考虑状压。对于 check 的每一个 mid,将大于等于它的记为 1,其余为 0。把每一排压缩成一个数,只要有两个数按位或之后是二进制下的全一串就返回 1,由于 m 最大值为 8,所以状压后只有 256 种情况,开个桶判断即可。

浙公网安备 33010602011771号