202006-2 稀疏向量
因为N太大了,所以得用map来存一下,同时可以记录一下出现过哪些index,记录一下,然后遍历map,如果同一个位置,两个向量在这里都非0.那么项乘加到结果上。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
void pt(){ cout<<'\n';}
template<class H, class ... T> void pt(H h,T... t){ cout<<" "<<h; pt(t...);}
int N,w1,w2;
struct node{
ll a,b;
};
const int maxn = 1e6+10;
map<ll,node> mp;
ll idx[maxn],tail;
int main(){
cin>>N>>w1>>w2;
for(int i = 1;i<=w1;i++){
ll t,v;scanf("%lld %lld",&t,&v);
mp[t].a = v;
idx[++tail] = t;
}
for(int i = 1;i<=w2;i++){
ll t,v;scanf("%lld %lld",&t,&v);
mp[t].b = v;
idx[++tail] = t;
}
sort(idx+1,idx+tail+1);
tail = unique(idx+1,idx+tail+1) - idx-1;
ll ans = 0;
for(int i = 1;i<=tail;i++){
ans += mp[idx[i]].a * mp[idx[i]].b;
}
printf("%lld\n",ans);
return 0;
}