zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    oracle数据库物理结构逻辑结构内存区块进程管理
    系统的数据库设计
    大数据和高并发的解决方案总结
    Asp.net+WebSocket+Emgucv实时人脸识别
    初识Docker
    变位词程序的实现
    分布式系统常见问题#转载
    六类排序算法的C#实现
    Asp.net MVC 中Controller返回值类型ActionResult
    将应用程序中的一些参数写到xml配置文件中
  • 原文地址:https://www.cnblogs.com/zhangzizi/p/14400008.html
Copyright © 2011-2022 走看看