[语言月赛 202312] 颜料覆盖
题目背景
一副精美的画作可能需要很多次重复的颜料涂抹。涂抹的一层层颜料会产生许多覆盖。这一次我们将这一个情景简化后交给了你,希望你能够解开颜料覆盖的奥秘。
题目描述
给定一个 n n n 行 m m m 列的矩阵 a a a。每一行代表画作的一块区域。每一行从前往后分别代表 m m m 次绘画。
用 a i , j a _ {i, j} ai,j 代表序列中第 i i i 行第 j j j 列的元素, a i , j a _ {i, j} ai,j 代表区域 i i i 在第 j j j 次绘画中被涂抹的颜料强度。如果 a i , j = 0 a _ {i, j} = 0 ai,j=0,那么代表区域 i i i 在第 j j j 次中未被涂抹。
现在,对于每个区域,你需要找出涂抹强度最大的一次是哪一次。同时,你需要找出,在这一次之前,有多少次涂抹(不计算未涂抹的情况)强度比这一次小。
保证对于某个区域,不会出现两次涂抹强度相同且最大。
输入格式
输入共 n + 1 n + 1 n+1 行。
第一行为两个整数
n
,
m
n, m
n,m,分别代表区域数和绘画次数。
接下来
n
n
n 行,每行
m
m
m 个整数,代表矩阵
a
a
a。
输出格式
输出共 n n n 行,每行两个整数,分别代表涂抹强度最大的一次是哪一次,和在这一次之前,有多少次涂抹(不计算未涂抹的情况)强度比这一次小。
样例 #1
样例输入 #1
3 5
0 1 0 3 2
0 0 1 0 0
1 1 3 4 5
样例输出 #1
4 1
3 0
5 4
提示说明
样例 1 解释
- 第一行(第一个区域)中,第
4
\color{red}4
4 次涂抹的强度最大,为
3
3
3。在第
4
4
4 次之前,有且仅有第
2
2
2 次这一次「有涂抹(不为
0
0
0)」且「强度比第
4
4
4 次小」,故答案为
4 1
。 - 第二行(第二个区域)中,第
3
\color{red}3
3 次涂抹的强度最大,为
1
1
1。在第
3
3
3 次之前,该区域没有被涂抹过(即第
3
3
3 次之前全为
0
0
0),故答案为
3 0
。 - 第三行(第三个区域)中,第
5
\color{red}5
5 次涂抹的强度最大,为
5
5
5。在第
5
5
5 次之前,有
4
\color{red}4
4 次「有涂抹」且「强度比第
5
5
5 次小」,因此答案为
5 4
。
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 1 ≤ n , m ≤ 1 0 6 1 \leq n, m \leq 10 ^ 6 1≤n,m≤106, 1 ≤ n × m ≤ 1 0 6 1 \leq n \times m \leq 10 ^ 6 1≤n×m≤106, 0 ≤ a i , j ≤ 1 0 9 0 \leq a _ {i, j} \leq 10 ^ 9 0≤ai,j≤109。
测试点 | n n n | m m m | 特殊性质 |
---|---|---|---|
1 1 1 | = 1 = 1 =1 | = 1 = 1 =1 | 无 |
2 ∼ 3 2 \sim 3 2∼3 | ≤ 10 \leq 10 ≤10 | ≤ 10 \leq 10 ≤10 | 无 |
4 ∼ 6 4 \sim 6 4∼6 | ≤ 1 0 3 \leq 10 ^ 3 ≤103 | ≤ 1 0 3 \leq 10 ^ 3 ≤103 | 无 |
$7 $ | ≤ 1 \leq 1 ≤1 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 无 |
8 8 8 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | ≤ 1 \leq 1 ≤1 | 无 |
9 ∼ 10 9 \sim 10 9∼10 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 每一行的第一个元素是这一行的最大值 |
11 ∼ 12 11 \sim 12 11∼12 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 每一行的最后一个元素是这一行的最大值 |
13 ∼ 14 13 \sim 14 13∼14 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 每一行有且仅有一个非 0 0 0 元素 |
15 ∼ 20 15 \sim 20 15∼20 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | ≤ 1 0 6 \leq 10 ^ 6 ≤106 | 无 |
保证在矩阵的某一行中不存在两个元素相同且最大,保证不存在某一行全部为 0 0 0。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,m;
cin>>n>>m;
ll a,maxl,op,k,cnt;
while(n--)
{
maxl=op=k=-1;
for(ll j=1;j<=m;j++)
{
cin>>a;
if(a) k++;
if(maxl<a)
{
maxl=a;
op=j;
cnt=k;
}
}
cout<<op<<" "<<cnt<<endl;
}
return 0;
}