绘制二维矩阵的行和列
Posted
技术标签:
【中文标题】绘制二维矩阵的行和列【英文标题】:Painting rows and columns of a 2D matrix 【发布时间】:2020-06-16 10:07:32 【问题描述】:问题:我们给出了一个 nxm 矩阵,初始初始化为 0。我们必须执行 k 个查询: 每个查询都支持两种操作之一。
用颜色 ai 绘制 ri 行中的所有元素。
用颜色 ai 绘制 ci 列中的所有元素。 同一元素可以多次绘制。但是该元素的颜色与该元素的最后绘制颜色相同。您必须在绘制后打印最终的矩阵。
输入:第一行包含三个空格分隔的整数 N,M,K 接下来的 K 行只包含一种要执行的操作类型 1) 1 ri ai 表示行 ri 涂有颜色 ai 2) 2 ci ai 表示列 ci 用颜色 ai 绘制 输出:绘制后打印最终大小为 nxm 的矩阵。 样本输入: 3 3 3 1 1 3 2 2 1 1 2 2 输出: 3 1 3 2 2 2 0 1 0 我已经编写了以下代码来解决它,但它显示了某些测试用例的 TLE。你能给我一些想法如何以有效的方式解决它吗? 我的代码
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int mat[5000][5000];
int main()
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m,k,q,r,c,val,i,j,re;
cin>>n>>m>>re;
while(re--)
cin>>q;
if(q==1)
cin>>r;
cin>>val;
i=r-1;
for(j=0,k=m-1;j<=k;j++,k--)
mat[i][j]=val;
mat[i][k]=val;
else if(q==2)
cin>>c>>val;
j=c-1;
for(i=0,k=n-1;i<=k;i++,k--)
mat[i][j]=val;
mat[k][j]=val;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cout<<mat[i][j]<<" ";
cout<<endl;
【问题讨论】:
为什么用两个绘制操作来划分循环?这是展开的廉价尝试吗? 如果您是 C++ 新手,我建议您阅读:Why using namespace std is considered bad practise,这很有趣! 【参考方案1】:只需要记住对给定行或给定列影响的最后一种颜色,以及最后一次执行的时间。
然后,对于给定的元素mat[i][j]
,我们只需检查行i
的最后一次修改是否发生在j
列的最后一次修改之前或之后。
我们甚至不需要设置这样的矩阵。
#include <iostream>
#include <ios>
#include <vector>
int main()
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int n, m, re;
std::cin >> n >> m >> re;
std::vector<int> row_color (n, 0), row_date (n, -1);
std::vector<int> col_color (m, 0), col_date (m, -1);
int date = 0;
while (re--)
int q, index, val;
std::cin >> q >> index >> val;
index--;
if (q == 1)
row_color[index] = val;
row_date[index] = date;
else
col_color[index] = val;
col_date[index] = date;
++date;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
int val = (row_date[i] > col_date[j]) ? row_color[i] : col_color[j];
std::cout << val << " ";
std::cout << "\n";
【讨论】:
很好的解决方案!【参考方案2】:您可以:
在解析输入时,保持并更新:
对于每一行,最后一个颜色ai
应该被涂上,对应的值 k
(从 0 到 K)
每列都一样
设置一个绘制操作数组,为发生绘制的所有行和列组合行和列绘制
根据k
对数组进行排序
对初始化为 0 的矩阵执行这些操作
如果存在较大的k
(因此,大量的重绘),您可以从这类问题中获得该算法的优势。
【讨论】:
以上是关于绘制二维矩阵的行和列的主要内容,如果未能解决你的问题,请参考以下文章