牛客小白月赛11 C Rinne Loves Study

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

题目描述

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

输入描述:

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

输出描述:

输出一个 n×mn×m 的矩阵 a,ai,jai,j 表示第 i 行第 j 列这个单词最后一次被背诵是在第几天。
示例1

输入

复制
3 3 3
1 2
2 3
1 3

输出

复制
0 0 2
1 1 2
3 3 3

备注:

n×m105,T105
这个题当时傻逼了,直接就去莽了。t到自闭,后来发现不对劲
才想到了正确解法

开1e5*1e5会爆内存(全局不一定),而且会t,需要点四维转换,

可以开两个数组a,b,a[i]表示第i行的背的第几天,

b[i]表示第i列的背的第几天,

因为会覆盖,天数越大越优先,所以最后要求的i行j列的背的最后天数为max(a[i],b[j])

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn];
int main()
{
    int n,m,t;
    int i,j;
    int k,l;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>n>>m>>t;
    for(i=1; i<=t; i++)
    {
        cin>>k>>l;
        if(k==1)a[l-1]=i;
        else b[l-1]=i;
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            cout<<max(a[i],b[j])<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

 
posted @ 2019-02-10 15:29  悲离  阅读(232)  评论(0编辑  收藏  举报