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\)维整数向量\(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;
}