CCF CSP202006-2 稀疏向量

15 篇文章 0 订阅

本题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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值