• csp 2020062 稀疏向量(双指针)


    题目传送门

    题目描述


    扫描

    分析

    首先看数据范围,肯定不能两个向量都读进来然后两重循环遍历,遇到id相等的就乘

    可以用双指针的思想,先把第一个向量存起来,然后用一个指针指着第一个向量当前的坐标,然后读取第二个向量的时候移动第一个向量的指针,从而遇到id相同的就将val乘起来。

    需要注意的是,第一个指针要判断有没有出边界

    while (k < h.size() && h[k].id < bid) k++; // 下面就是大于等于
    												   // 不要忘记了 k < h.size()
    if(k == h.size()) break; // a用完了
    

    代码

    #include<iostream>
    #include<cstdio>
    #include<vector>
    using namespace std; 
    typedef long long LL;
    struct VER
    {
    	LL id;
    	LL val;
    };
    vector<VER> h;
    LL n, a, b;
    
    int main()
    {
    	scanf("%lld%lld%lld", &n, &a, &b);
    	
    	for(int i = 0; i < a; i++)
    	{
    		VER p;
    		scanf("%lld%lld", &p.id, &p.val);
    		h.push_back(p);
    	}		
    	
    	LL res = 0; 
    	LL k = 0;
    	
    	for(int i = 0; i < b; i++)
    	{
    		LL bid, bval;
    		scanf("%lld%lld", &bid, &bval);
    		
    		
    		while (k < h.size() && h[k].id < bid) k++; // 下面就是大于等于
    												   // 不要忘记了 k < h.size()
    		if(k == h.size()) break; // a用完了 
    		
    		if(h[k].id == bid)
    		{
    			res += (LL) h[k].val * bval;
    			k++;
    		}  
    	}
    	printf("%lld\n", res);
    	return 0;
    } 
    

    时间复杂度

    参考文章

  • 相关阅读:
    Java经典逻辑编程50题 (转)
    Programmingbydoing
    前端测试框架jest 简介
    puppeteer入门
    面向对象编程
    Java常识
    JS 变量
    jmeter 压力测试
    jmeter 安装
    Java 数据驱动测试
  • 原文地址:https://www.cnblogs.com/VanHa0101/p/16023258.html
Copyright © 2020-2023  润新知