Codeforces#344 Div2 B問題

はじめに

Codeforces Round #344 Div. 2 Prob. B. Print Check

問題:http://codeforces.com/contest/631/problem/B

行か列を一気に色(数字で表現)で塗る。最後の状態を出力する。

考え方

各行、各列で最後に塗られた色と、塗られた時間を記録する。各要素は属する行と列の遅く塗られたほうの色になる。計算量はO(n*m + k)。

解法

#include <iostream>
#include <vector>

using namespace std;

int main() {
    cin.tie(nullptr); ios::sync_with_stdio(false);

    int n,m,k;
    cin >> n >> m >> k;

    vector<int> row_color(n,0),row_last(n,0);
    vector<int> col_color(m,0),col_last(m,0);
    for(int i = 0; i < k; ++i){
        int task_id,rc,a;
        cin >> task_id >> rc >> a;
        rc--;
        bool is_row = false;
        if(task_id==1) is_row = true;

        if(is_row){
            row_color[rc] = a;
            row_last[rc] = i+1;
        }else{
            col_color[rc] = a;
            col_last[rc] = i+1;
        }
    }

    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            if(j!=0) cout << " ";
            int num = 0;
            if(col_last[j]<row_last[i]){
                num = row_color[i];
            }else{
                num = col_color[j];
            }

            cout << num;
        }
        cout << endl;
    }

    return 0;
}