思路:正常离散存储,把下标相同的对应位置乘起来相加。注意数据范围,需要使用long long
(是我的错觉吗,怎么感觉比第一个题简单)
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<sstream>
using namespace std;
const int N = 105;
typedef long long ll;
typedef pair<ll,ll> pa;
int main()
{
int n,a,b;
cin>>n>>a>>b;
vector<pa> v1,v2;
for(int i=0;i<a;i++)
{
ll x,y;
cin>>x>>y;
v1.push_back({x,y});
}
for(int i=0;i<b;i++)
{
ll x,y;
cin>>x>>y;
v2.push_back({x,y});
}
ll ans=0;
int i=0,j=0;
while(i<a&&j<b)
{
if(v1[i].first==v2[j].first)
ans+=v1[i].second*v2[j].second,i++,j++;
else if(v1[i].first>v2[j].first)
j++;
else
i++;
}
cout<<ans<<endl;
return 0;
}