CCF CSP 2020062 稀疏向量

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\)维整数向量\(v\in \mathbb{Z^n}\),如果其在且仅在\(a\)个维度上取值不为0,则可以唯一表示为:

    \[[(index_1,value_1), (index_2,value_2),...,(index_a,value_a)] \]

  • 其中所有的\(index\)均为整数且满足:

    \[1\le index_1\lt index_2 \lt ...\lt index_a \le n \]

  • \(value_i\)表示向量\(v\)在对应维度\(index_i\)上的非零值。

    给出两个\(n\)维整数向量\(u·v\in \mathbb{Z^n}\)的稀疏向量表示,试计算它们的内积。

    \[u·v=\sum_{i=1}^n u_i·v_i \]

输入格式

从标准输入读入数据。

输入的第一行包含用空格分隔的三个正整数\(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\)

子任务

  • 输入数据保证\(0\lt a,b \lt n\)
  • 向量\(u\)\(v\)在每一维度上取值的绝对值\(|u_i|,|v_i| \le 10^6(1\le i\le n)\)

分析

  • 建立一个vector,在输入第二个向量的数据时,同时进行运算满分。
  • 时间复杂度:a+a*b

代码

#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;
}
原文地址:https://www.cnblogs.com/zhangzizi/p/14400008.html