题意简述
交互题。
矩阵 $n\times m$,有性质:
对于任意子矩阵(即任意行的子集和列的子集的交),设子矩阵中第 $i$ 行最小值最先出现的位置是 $L(i)$,则 $L(i)$ 单调不降。
通过不超过 $4(n + m)$ 次单点询问确定该矩阵的最小值。
主要思路
转化问题为对每行 $i$ 求 $ans_i$ 使得 $(i, ans_i)$ 为该行最小最前的位置。
那么根据给定的性质,一个自然的想法是:
假如现在需要求答案的行集合为 $S$(按大小排序),已求出 $T = \{S_{2i}\}$ 的答案。
则此时 $S$ 中未被求出答案的所有元素 $x$ 的答案都被限定在上下两元素的答案范围内,可以暴力询问求解。
边界情况显然为 $|S| = 1$,此时使用 $m$ 次询问暴力求出答案即可。
那么对于集合 $S$,记其最多需要的询问次数为 $f(|S|) = f(\frac{|S|}{2}) + |S| + m$。
则总共需要 $2n + m\log n$ 次。
尽管 $n$ 的系数足够小,但 $m$ 的系数太大。
设可能的列的集合为 $T$,如果 $|T|>|S|$,我们尝试将先减小 $T$ 的大小。
考虑两个元素 $a(x, l), a(x, r)$。
如果 $a(x, l)\le a(x, r)$,则显然对于任意 $i\le x$,$L(i)\ne r$;
如果 $a(x, l)> a(x, r)$,则同理对于任意 $i\ge x$,$L(i)\ne l$。
由此我们可以在 $|S| + |T|$ 步内将 $T$ 的大小缩小为 $|S|$。
此时对于集合 $S$,最多需要的询问次数即为 $f(|S|) = f(\frac{|S|}{2}) + 2|S| + 2|T|$,即最多需要 $4(n + m)$ 次。
参考代码
1 |
|