注意到每次只染色一行或者一列,那么我们最后输出第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(" "); } 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 */