Rinne Loves Study

链接:https://ac.nowcoder.com/acm/contest/6928/A
来源:牛客网

题目描述

Rinne 喜欢使用一种奇怪的方法背单词,现在这些单词被放在了一个$ n \times m$的格子里。由于背单词是一个令人烦躁的事情,所以她决定每天只背同一行或者同一列的单词。她一共会背 T 次单词,为了方便巩固,她现在想知道:对于每个单词,最后一次背是什么时候呢?
她这么可爱当然会算啦!但是她想考考你。

输入描述:

第一行三个整数 n,m,T。
接下来 T 行,第 i+1 行描述第 i 天干了什么,每行的格式如下:
`1 x`:说明她在这一天背了第 x 行的单词;
`2 y`说明她在这一天背了第 y 列的单词。
输入的所有量的具体意义请参考「题目描述」。

输出描述:

​ 输出一个\(n \times m\)的矩阵a,\(a_{ij}\) 表示第 i 行第 j 列这个单词最后一次被背诵是在第几天。

示例1

输入

3 3 3
1 2
2 3
1 3

输出

0 0 2
1 1 2
3 3 3

备注:

\(n\times m \leq 10^{5},T\leq 10^{5}\)

题解

暴力做法:

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int n,m,T;
	int a,b;
	scanf("%d%d%d",&n,&m,&T);
	int map[n+1][m+1];
	memset(map,0,sizeof(map));
	for(int i=1;i<=T;i++){
		scanf("%d%d",&a,&b);
		if(a==1){
			for(int j=1;j<=m;j++){
				map[b][j]=i;
			}
		}
		if(a==2){
			for(int j=1;j<=n;j++){
				map[j][b]=i;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("%d ",map[i][j]);
		}
		printf("\n");
	}
	return 0;
}

很奇怪的是这题暴力也可以做,暴力的话,定义一个二维数组,然后根据天数顺序来维护这个数组,比如第一天背了第2行的单词,就把这个数组第2行都刷成1,第五天背了第6列的单词,就把这个数组第6列都刷成5,最后得到的二维数组就是答案

非暴力法:

#include<iostream>
using namespace std;
int Col[100005];//保存列 
int Row[100005];//保存行 
int main(){
	int n,m,T;
	scanf("%d%d%d",&n,&m,&T);
	for(int i=1;i<=T;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		//保存行 
		if(a==1){
			Row[b]=i;
		}	
		//保存列 
		else if(a==2){
			Col[b]=i;
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("%d ",max(Row[i],Col[j]));
		}
		printf("\n");
	}
	return 0;
}

我们只定义两个数组,一个存放行的信息,一个存放列的信息,当第一天背了第2行的单词时,我们就把行数组中下标为2的元素赋值1,当第五天背了第6列的单词时,我们就把列数组中下标为6的元素赋值为5,然后输出的时候,就输出对应的行数组和列数组中较大的那个,因为最后一次背这个单词的天数肯定大,比如说,我们要输出第2行第3列的数,那么我们就比较一下,行数组下标为2的元素和列数组下标为3的元素的大小,输出大的。

posted @ 2020-08-06 19:11  ice--cream  阅读(125)  评论(0编辑  收藏  举报