#include<iostream>
#include<vector>
using namespace std;
typedef pair<int, int> Svector;
typedef long long LL;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0);
vector<Svector> u, v;
int n; cin >> n;
int a, b; cin >> a>>b;
for(int i=0;i<a;i++)
{
int index, value;
cin >> index >> value;
u.push_back({ index,value });
}
for (int i = 0; i < b; i++)
{
int index, value;
cin >> index >> value;
v.push_back({ index,value });
}
LL sum = 0;
int j = 0;
for (int i=0;i<u.size();i++)
{
/*当j与i不匹配时j自增至匹配,注意不要超过数组范围*/
while (u[i].first > v[j].first&&j<v.size()-1) j++;
if (u[i].first == v[j].first) sum += u[i].second * v[j].second;
}
cout << sum;
return 0;
}
很经典的双指针算法应用,可能不是最快的但是胜在直观
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
以测试数据举例
u: 4 7 10
v :1 4 5 7
开始时 指针i指向4,j指向1
i一次迭代,4与4完成匹配
接下来i迭代至7又与7匹配,直至结束
因为题目保证u,v输入是一定是递增顺序,所以一定能保证u,v中每个相同的值都能成功匹配