欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSP 202006-2 稀疏向量

程序员文章站 2024-03-17 21:38:40
...

CSP 202006-2 稀疏向量
CSP 202006-2 稀疏向量
题目分析
  每一个取值不等于0的维度,都可以用结构体变量来存储,其结构体的定义如下,内部成员有维度索引idx,此维度上的值val

struct Node{
    int idx;
    int val;
}vec1[500005], vec2[500005];

  题目中涉及到两个向量,并且每个向量的非零值的数量不会超过500000,因此可以用结构体数组vec1vec2来表示这两个向量的稀疏表示。
  每个向量在输入时,都是按照索引值有序的,这为我们求内积提供了很大的方便。定义两个下标索引p1p2,都是从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
*/