[满分代码] CCF CSP 202006-2 稀疏向量

一、题目背景

稀疏向量(svector)
【题目描述】
对于一个 n 维整数向量 v ∈ Zn,其在第 index 个维度上的取值记作 vindex。这里我
们约定 index 的取值从 1 开始,即 v =(v1, v2, · · · , vn)。下面介绍一种向量的稀疏表示
方法。
如果 v 仅在少量维度上的取值不.为 0,则称其为稀.疏.向.量.。
例如当 n =10 时,v =(0, 0, 0, 5, 0, 0, −3, 0, 0, 1) 就是一个稀疏向量。
由于稀疏向量的非零值较少,我们可以通过仅存储非零值的方式来节省空间。具体
来说,每个非零值都可以用一个 (index, value) 对来表示,即该向量在第 index 个维度上
的取值 vindex =value ,0。在上面的例子中,v 就可以表示为 [(4, 5), (7, −3), (10, 1)]。
接下来给出这种稀疏表示一般化的定义。
• 对于任意一个 n 维整数向量 v ∈ Zn,如果其在且仅在 a 个维度上取值不为 0,则
可以唯一表示为:

[(index1, value1), (index2, value2), · · · , (indexa, valuea)]
• 其中所有的 index 均为整数且满足:
1 ≤ index1 < index2 < · · · < indexa ≤ n
• valuei 表示向量 v 在对应维度 indexi 上的非零值。
给出两个 n 维整数向量 u, v ∈ Zn 的稀疏表示,试计算它们的内积。

【输入格式】
从标准输入读入数据。
输入的第一行包含用空格分隔的三个正整数 n、a 和 b,其中 n 表示向量 u、v 的
维数,a 和 b 分别表示两个向量所含非零值的个数。
第二行到第 a +1 行输入向量 u 的稀疏表示。第 i +1 行(1 ≤ i ≤ a)包含用空格分
隔的两个整数 indexi 和 valuei,表示 uindexi =valuei ,0。
第 a +2 行到第 a +b +1 行输入向量 v 的稀疏表示。第 j +a +1 行(1 ≤ j ≤ b)包
含用空格分隔的两个整数 indexj 和 valuej,表示 vindexj =valuej ,0。

在这里插入图片描述

在这里插入图片描述

二、代码及分析

这次这道题非常奇怪,稍有不慎就超时。
并且同样的思路,用Python写来就一定超时…
包括下面这份代码,三次OJ分数也不一样,有一次是满分… 姑且称为满分代码吧,我实在是想不到更好的办法了。

苦了参加这次CSP的同学…
在这里插入图片描述
{2020.7.27更新代码}
以评论区 @create-two 同学的思路,少建立一个vector,稳定不超时,感谢create-two同学~

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int n, a, b, x, y;
	long long innerProduct = 0;
	cin >> n >> a >> b;
	vector<pair<int, int>> v1;

	for (int i = 0; i < a; ++i)
	{
		cin >> x >> y;
		v1.emplace_back(make_pair(x, y));
	}
	int i=0,x1,y1;
	for (int j = 0; j < b; ++j)
	{
		cin >> x1 >> y1;
		while(i<a)
		{
			if(x1<v1[i].first)
			{
				break;
			}
			else if(x1>v1[i].first)
			{
				++i;
			}
			else
			{
				innerProduct+=y1*v1[i].second;
				++i;
			}
		}
	}
	cout << innerProduct<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/107527537