涂色游戏

题目链接

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;
 }

题目评价

  • 此题考查时间复杂度和空间复杂度的分析和对题目细节的阅读能力,很赞的题目
posted @ 2023-03-13 11:16  TFLSNOI  阅读(76)  评论(0编辑  收藏  举报