7-4 稀疏矩阵加法 (20 分)
给定两个矩阵A和B,求其和矩阵C=A+B。
输入格式:
第一行包含两个数Row和Col,分别表示矩阵的行数和列数,A和B的维度是一致的。
第二行只有一个数N1,表示接下来要输入的A中的非零元素的个数。
接下来是N1行,每一行都是i j A[i,j] 这样的形式,表示的A中第i行第j列的元素A[i,j],为了与大多数编程语言保持一致,它们都是从零开始的,也就是说下标的有效范围是[0,Row−1]×[0,Col−1]。
在N1行之后,是一个数N2,表示矩阵B中非零元素的数量,此后N2行描述B中的非零元素,它们与此前描述A中非零元素的形式一致。
矩阵元素的输入均遵循行主序。这里的所有的输入均可用int
类型正确表示,可以假设输入均是合法的。
输出格式:
第一行输出和矩阵C=A+B中的绝对值大于0.1的元素个数N3,此后是N3行,按照行主序输出其中的非零元素,依次是行、列的下标和对应的元素。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<vector>
#define inf 2147483647
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rr read()
#define ll long long
#define repb(i,a,b) for(int i=a;i<=b;i++)
#define CloseIo ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
int read()
{
char ch = getchar();
int x = 0, f = 1;
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
int main()
{
map<pair<int,int>,int>m;
int n=rr,mm=rr;
int n1=rr;
rep(i,0,n1)
{
int x=rr,y=rr,v=rr;
pair<int,int>tt(x,y);
m[tt]+=v;
}
int n2=rr;
rep(i,0,n2)
{
int x=rr,y=rr,v=rr;
pair<int,int>tt(x,y);
m[tt]+=v;
}
//printf("\n\n");
vector<int>v,v1,v2;
for(map<pair<int,int>,int>::iterator it=m.begin();it!=m.end();it++)
{
if((*it).second)
{v.push_back((*it).first.first);
v1.push_back((*it).first.second);
v2.push_back((*it).second);
}
}
printf("%d\n",v.size());
for(int i=0;i<v.size();i++)
cout<<v[i]<<" "<<v1[i]<<" "<<v2[i]<<"\n";
}