csp 202006-2 稀疏向量(双指针)

题目传送门

题目描述


扫描

分析

首先看数据范围,肯定不能两个向量都读进来然后两重循环遍历,遇到id相等的就乘

可以用双指针的思想,先把第一个向量存起来,然后用一个指针指着第一个向量当前的坐标,然后读取第二个向量的时候移动第一个向量的指针,从而遇到id相同的就将val乘起来。

需要注意的是,第一个指针要判断有没有出边界

while (k < h.size() && h[k].id < bid) k++; // 下面就是大于等于
												   // 不要忘记了 k < h.size()
if(k == h.size()) break; // a用完了

代码

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std; 
typedef long long LL;
struct VER
{
	LL id;
	LL val;
};
vector<VER> h;
LL n, a, b;

int main()
{
	scanf("%lld%lld%lld", &n, &a, &b);
	
	for(int i = 0; i < a; i++)
	{
		VER p;
		scanf("%lld%lld", &p.id, &p.val);
		h.push_back(p);
	}		
	
	LL res = 0; 
	LL k = 0;
	
	for(int i = 0; i < b; i++)
	{
		LL bid, bval;
		scanf("%lld%lld", &bid, &bval);
		
		
		while (k < h.size() && h[k].id < bid) k++; // 下面就是大于等于
												   // 不要忘记了 k < h.size()
		if(k == h.size()) break; // a用完了 
		
		if(h[k].id == bid)
		{
			res += (LL) h[k].val * bval;
			k++;
		}  
	}
	printf("%lld\n", res);
	return 0;
} 

时间复杂度

参考文章

posted @ 2022-03-18 19:23  VanHope  阅读(48)  评论(0编辑  收藏  举报