首页 > 试题广场 >

最好的朋友1

[编程题]最好的朋友1
  • 热度指数:15 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}笨蛋同学被怪兽抓走了!她不希望天才同学冒险来救她,于是留下了一些谜题。
\hspace{15pt}但是,天才同学认为:“无论如何,笨蛋同学都是我最好的朋友,她需要我”。于是踏上了拯救笨蛋同学之路。
\hspace{15pt}笨蛋同学留下了一个 n \times m 的整数矩阵。你需要为每一组测试数据计算一个“密码”。
\hspace{15pt}我们先定义两件事:
\hspace{15pt}1. 子矩阵
\hspace{15pt}从矩阵中选出连续的若干行(比如第 x 行到第 y 行),再选出连续的若干列(比如第 l 列到第 r 列),它们交叉出来的那一块就是一个子矩阵。子矩阵必须非空。
\hspace{15pt}2. 子矩阵的值
\hspace{15pt}一个子矩阵的值等于它里面所有元素的按位与。记按位与为 \operatorname{and}。例如:6 \operatorname{and} 10 = 2
\hspace{15pt}把这个矩阵的所有子矩阵都列出来。每个子矩阵都会得到一个整数值。把这些值放到一个数组里,从小到大排序。
\hspace{15pt}设一共有 k 个子矩阵。
\hspace{15pt}把所有子矩阵的值从小到大排序后,我们定义中位数为第 \left\lfloor \frac{k+1}{2} \right\rfloor 个数。这个数就是本题答案。
\hspace{15pt}\lfloor x \rfloor:代表对 x 进行下取整操作,得到不超过 x 的最大整数。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1 \leqq T \leqq 100\right) 代表数据组数,每组测试数据描述如下:
\hspace{15pt}第一行输入两个整数 n,m\left(1 \leqq n, m \leqq 200\right) 表示矩阵的行数与列数。
\hspace{15pt}此后 n 行,第 i 行输入 m 个整数 a_{i,1}, a_{i,2}, \dots, a_{i,m}\left(1 \leqq a_{i,j} \leqq 1000\right),表示矩阵第 i 行第 j 列的元素。
\hspace{15pt}除此之外,保证单个测试文件的所有测试数据满足:\sum n \leqq 300\sum m \leqq 300


输出描述:
\hspace{15pt}对于每一组测试数据,新起一行,输出一个整数,表示谜题答案。
示例1

输入

2
2 2
7 6
5 4
1 3
1 3 7

输出

5
1

说明

\hspace{15pt}第一组测试数据是一个 2 \times 2 矩阵,一共有 k=9 个子矩阵。它们的按位与结果分别为:
\hspace{23pt}\bullet\,四个 1 \times 1 子矩阵:7, 6, 5, 4
\hspace{23pt}\bullet\,两个 1 \times 2 子矩阵:7 \operatorname{and} 6 = 65 \operatorname{and} 4 = 4
\hspace{23pt}\bullet\,两个 2 \times 1 子矩阵:7 \operatorname{and} 5 = 56 \operatorname{and} 4 = 4
\hspace{23pt}\bullet\,一个 2 \times 2 子矩阵:7 \operatorname{and} 6 \operatorname{and} 5 \operatorname{and} 4 = 4
\hspace{15pt}把这 9 个值从小到大排序后,第 \left\lfloor \frac{9+1}{2} \right\rfloor = 5 个数是 5,所以答案是 5
\hspace{15pt}第二组测试数据是一个 1 \times 3 矩阵,一共有 k=6 个子矩阵。它们的按位与结果是 1,3,7, 1 \operatorname{and} 3 = 1, 3 \operatorname{and} 7 = 3, 1 \operatorname{and} 3 \operatorname{and} 7 = 1。排序后第 \left\lfloor \frac{6+1}{2} \right\rfloor = 3 个数为 1,所以答案是 1

备注:
\hspace{15pt}如果您选用 Python 作答本题,请注意:在几乎全部的情况下,PyPy 的运行速度优于 Python,我们建议您选择对应版本的 PyPy 进行提交、而不是 Python。
头像 WIDA
发表于 2026-04-20 16:53:40
题意 给定一个 的整数矩阵,要求计算出所有非空子矩阵的元素按位与结果,并将这些结果从小到大排序,求出中位数(即第 个数,其中 为子矩阵总数)。 题解 矩阵元素最大值不超过 ,因此所有子矩阵的按位与结果必然落在 的范围内。我们可以直接统计这 种结果各自出现的总次数,最后通过累加频次寻找出中位 展开全文