其他分享
首页 > 其他分享> > CCF CSP 202006-2 稀疏向量

CCF CSP 202006-2 稀疏向量

作者:互联网

202006-2 稀疏向量

题目描述

对于一个n维整数向量\(v \in \mathbb{Z^n}\),其在第\(index\)个维度上的取值记作\(v_{index}\)。这里我们约定\(index\)的取值从1开始,即\(v=(v_1,v_2,...,v_n)\)。下面介绍一种向量的稀疏表示方法。

如果\(v\)仅在少量维度上的取值不为0,则称其为稀疏向量。

例如当\(n=10\)时,\(v=(0,0,0,5,0,0,-3,0,0,1)\)就是一个稀疏向量。

由于稀疏向量的非零值较少,我们可以通过仅对存储非零值的方式来节省空间。具体来说,每个非零值都可以用一个\((index,value)\)对来表示,即该向量在第\(index\)个维度上取值\(v_{index}=value\neq 0\)。在上面的例子中,\(v\)就可以表示为\([(4,5),(7,-3),(10,1)]\)。

接下来给出这种稀疏表示一般化的定义。

输入格式

从标准输入读入数据。

输入的第一行包含用空格分隔的三个正整数\(n\)、\(a\)和\(b\),其中\(n\)表示向量\(u,v\)的维数,\(a\)和\(b\)分别表示两个向量所含非零值的个数。

第二行到第\(a+1\)行输入向量\(u\)的稀疏表示。第\(i+1\)行(\(1\le i \le a\))包含用空格分隔的两个整数\(index_i\)和\(value_i\),表示\(u_{index_{i}}=value_i \neq 0\)。

第\(a+2\)行到第\(a+b+1\)行输入向量\(v\)的稀疏表示。第\(j+a+1\)行(\(1\le j \le b\))包含用空格分隔的两个整数\(index_i\)和\(value_j\),表示\(v_{index_{j}}=value_j \neq 0\)。

输出格式

输出到标准输出。

输出一个整数,表示向量\(u\)和\(v\)的内积\(u·v\)。

样例输入

10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40

样例输出

-20

样例解释

\(u=(0,0,0,5,0,0,-3,0,0,1)\)

\(v=(10,0,0,20,30,0,40,0,0,0)\)

\(u·v=50\times20+(-3)\times40=-20\)

子任务

分析

代码

#include<iostream>
#include<map>

using namespace std;
map<int, int> svector;

int main() {
    ios::sync_with_stdio(false);
    int n, a, b;
    cin >> n >> a >> b;
    int index, value, i;
    long long sum = 0;
    for (i = 1; i <= a; i++) {
        cin >> index >> value;
        svector[index] = value;
    }
    for (i = 1; i <= b; i++) {
        cin >> index >> value;
        if (svector[index] != 0) {
            sum += svector[index] * value;
        }
    }
    cout << sum << endl;
    return 0;
}

标签:index,le,10,稀疏,value,202006,CCF,CSP,向量
来源: https://www.cnblogs.com/zhangzizi/p/14400008.html