题目链接
paint
题解
- 方法一:55分,纯模拟,用二维数组存储网格显然会爆空间,超空间,超时间。
#include<bits/stdc++.h>
using namespace std;
int t, n, m, q;
const int maxN=1e4+10;//如果此处按题意开成1e5会导致空间爆掉
const int maxM=1e4+10;
int a[maxN][maxM];
int opt, x, c;
int main()
{
cin>>t;
while(t--){
cin>>n>>m>>q;
memset(a, 0, sizeof(a));
while(q--){
cin>>opt>>x>>c;
if(opt==0)
for(int i=1; i<=m; i++)
a[x][i]=c;
if(opt==1)
for(int i=1; i<=n; i++)
a[i][x]=c;
}
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
- 方法二:100分,用二维数组存储网格显然会爆空间,不可能拿到满分。于是换一种思路,存储涂色方案,通过涂色方案来确定涂色结果。
#include<bits/stdc++.h>
using namespace std;
int t, n, m, q;
const int maxQ=1e5+10;
struct qnode{
int c;//存储颜色号
int qn;//存储刷色序号,根据题意后刷的颜色会覆盖先刷的颜色,所以最终颜色为qn大的
};
qnode hang[maxQ], lie[maxQ]; //记录被刷行、列的涂色情况
int opt, x, c;
int main()
{
cin>>t;
while(t--){
cin>>n>>m>>q;
memset(hang, 0, sizeof(hang));
memset(lie, 0, sizeof(lie));
for(int i=1; i<=q; i++){
cin>>opt>>x>>c;
if(opt==0){
hang[x].c=c; hang[x].qn=i;//注意此处,先刷颜色会被后刷颜色覆盖
}
if(opt==1){
lie[x].c=c; lie[x].qn=i;//注意此处,先刷颜色会被后刷颜色覆盖
}
}
for(int i=1; i<=n; i++){//n*m 的总和不超过 10^6,所以此处不会超时
for(int j=1; j<=m; j++){
if(hang[i].qn<lie[j].qn)//qn大也就是后刷的为最终颜色
cout<<lie[j].c<<" ";
else
cout<<hang[i].c<<" ";
}
cout<<endl;
}
}
return 0;
}
题目评价
- 此题考查时间复杂度和空间复杂度的分析和对题目细节的阅读能力,很赞的题目