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;
}