1. 程式人生 > 其它 >csp 202006-2 稀疏向量(雙指標)

csp 202006-2 稀疏向量(雙指標)

目錄

題目傳送門

題目描述


掃描

分析

首先看資料範圍,肯定不能兩個向量都讀進來然後兩重迴圈遍歷,遇到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;
} 

時間複雜度

參考文章