CSP 202006-2 稀疏向量
程序员文章站
2024-03-17 21:38:40
...
题目分析
每一个取值不等于0的维度,都可以用结构体变量来存储,其结构体的定义如下,内部成员有维度索引idx
,此维度上的值val
。
struct Node{
int idx;
int val;
}vec1[500005], vec2[500005];
题目中涉及到两个向量,并且每个向量的非零值的数量不会超过500000,因此可以用结构体数组vec1
和vec2
来表示这两个向量的稀疏表示。
每个向量在输入时,都是按照索引值有序的,这为我们求内积提供了很大的方便。定义两个下标索引p1
和p2
,都是从0开始,分别作为两个稀疏向量的索引。若vec1[p1].idx == vec2[p2].idx
,则令他们的val
相乘并加到最终结果中;若vec1[p1].idx < vec2[p2].idx
,则令p1++
;其它情况,令p2++
。
源代码
#include <bits/stdc++.h>
using namespace std;
struct Node{
int idx;
int val;
}vec1[500005], vec2[500005];
int main()
{
ios::sync_with_stdio(false);
int n, a, b, p1 = 0, p2 = 0;
long long ans = 0;
cin >> n >> a >> b;
for(int i = 0; i < a;i++)
cin >> vec1[i].idx >> vec1[i].val;
for(int i = 0; i < b; i++)
cin >> vec2[i].idx >> vec2[i].val;
while(p1 < a && p2 < b){
if(vec1[p1].idx == vec2[p2].idx){
ans += vec1[p1].val * vec2[p2].val;
p1++;
p2++;
}
else if(vec1[p1].idx < vec2[p2].idx)
p1++;
else
p2++;
}
cout << ans;
return 0;
}
/*
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
*/