1. 程式人生 > 實用技巧 >Rinne Loves Study

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的元素的大小,輸出大的。