(题目图片引用:CCF CSP 2020-06-2 “稀疏向量” 解题思路及满分代码(C++11)_csp稀疏向量_BlueMoon2000的博客-CSDN博客 【代码详解】
#include<iostream>
#include<algorithm>
using namespace std;
int n,x1,x2;//两个数相乘会暴int
long long sum;//一定要记得存储的范围
struct arr{
int index;
int value;
};
bool cmp(arr& a,arr& b) {
return a.index < b.index;
}//输入不一定按键值顺序输入,这点是看了人家的才想出来的,不然只有60分的基础分
int main()
{
arr a[1000010];arr b[1000010];
cin>>n>>x1>>x2;
for(int i=1;i<=x1;i++)
{
cin>>a[i].index >>a[i].value ;
}
for(int i=1;i<=x2;i++)
{
cin>>b[i].index >>b[i].value ;
}
sort(a, a+x1+1, cmp);
sort(b, b+x2+1, cmp);
for(int i=1,j=1;i<=x1&&j<=x2;i++)//双指针运算,此题数组数据范围很大
{
while(j<=x2&&b[j].index <a[i].index )j++;
if(j<=x2&&a[i].index==b[j].index)
sum+=a[i].value *b[j].value ;
}
cout<<sum;
return 0;
}
【做题感悟】
for(int i=1,j=1;i<=x1&&j<=x2;i++)
{
while(j<=x2&&b[j].index<a[i].index)j++;//双指针算法,一定是指到对应的位置,这样每次只比较一次
if(j<=x2&&a[i].index==b[j].index)
sum+=a[i].value*b[i].value;
}
//作用:降低时间复杂度O(n);
(双指针算法是个好东西,我特意更新了一篇学习笔记,有兴趣的大家可以参考)