本题n的变化范围能到1e9,数组不能开辟到这么大的内存空间,因此选用map来存储输入的稀疏向量a和b。同时由于map中包含find函数,其复杂度是O(logn),因此可以采取遍历稀疏向量a的方式,在稀疏向量a中查找关键字key是否能在稀疏向量b中找到,如果能找到,就将对应的map值相乘即可。详细代码如下所示:
#include<iostream>
#include<map>
using namespace std;
int main(){
map<int,int> u; //存储向量a的稀疏表示
map<int,int> v; //存储向量b的稀疏表示
int n,a,b;
scanf("%d%d%d",&n,&a,&b); //输入n,a,b
for(int i=0;i<a;i++){//循环输入向量a的系数表示(index,value)
int index,value;
scanf("%d %d",&index,&value);
u[index] = value;//将稀疏表示的a存入map u中
}
for(int i=0;i<b;i++){//循环输入向量b的系数表示(index,value)
int index,value;
scanf("%d %d",&index,&value);
v[index] = value;//将稀疏表示的b存入map v中
}
long long int sum = 0; //定义结果值sum,由于ui,vi取值到1e6,因此采用long long存储
//下面for循环遍历向量a的稀疏表示map u,在b的稀疏向量表示map v中查找是否含有map u中的关键字
//如果有,说明对应的valule值应该进行相乘,而value值可以用迭代器->second来表示
//最后输出结果sum
for(map<int,int>::iterator itu = u.begin();itu!=u.end();itu++){
map<int,int>::iterator itv = v.find(itu->first);
if(itv!=v.end()){
sum+= itu->second * itv->second;
}
}
cout<<sum<<endl;
return 0;
}