CF 631B 题解

题面

注意到每次只染色一行或者一列,那么我们最后输出第i行第j列的数字是多少的时候只需要看一下最后一次i行和第j行被染了什么颜色,所以我们需要对每一行和一列记录最后一次染色的颜色

但是我们也需要比较是行比列后染色还是列比行后染色,所以我们还需要记录一下每行每列染色的最后时间

然后模拟即可

#include <cstdio>
#include <iostream>
using namespace std;
int x[1000010],y[1000010],z[1000010];
int line[1010],cnt1,row[1010],cnt2;
int bo1[1010],bo2[1010];
int a[1010][1010];
int main() {
    freopen("matrix.in","r",stdin);
    freopen("matrix.out","w",stdout);
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(register int i=1;i<=q;i++){
        scanf("%d%d%d",&x[i],&y[i],&z[i]);
    }
    for(register int i=q;i>=1;i--){
        if(x[i]==1){
            if(bo2[y[i]]==0){
                row[++cnt2]=i;
                bo2[y[i]]=1;
            }
        }
        if(x[i]==2){
            if(bo1[y[i]]==0){
                line[++cnt1]=i;
                bo1[y[i]]=1;
            }
        }
    }
    register int l1=cnt1,l2=cnt2;
    while(l1>0&&l2>0){
        if(row[l2]<line[l1]){
            for(register int j=1;j<=m;j++){
                a[y[row[l2]]][j]=z[row[l2]];
            }
            --l2;
        }
        else{
            for(register int j=1;j<=n;j++){
                a[j][y[line[l1]]]=z[line[l1]];
            }
            --l1;
        }
    }
    while(l1>0){
        for(register int j=1;j<=n;j++){
            a[j][y[line[l1]]]=z[line[l1]];
        }
        --l1;
    }
    while(l2>0){
        for(register int j=1;j<=m;j++){
            a[y[row[l2]]][j]=z[row[l2]];
        }
        --l2;
    }
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=m;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
/*
3 3 3
1 1 3
2 2 1
1 2 2

5 3 5
1 1 1
1 3 1
1 5 1
2 1 1
2 3 1

6 4 9
1 1 1
1 3 2
1 4 3
2 2 4
1 2 5
2 3 6
1 4 7
2 2 1
1 2 1

*/

 

posted @ 2019-09-07 15:50  神之右大臣  阅读(193)  评论(0编辑  收藏  举报