Rinne Loves Study
阿新 • • 發佈:2020-08-06
連結: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的元素的大小,輸出大的。