题目
解析
这道题其实很简单,直接暴力就行了,但是一定要注意数据的范围,第一次直接int,就导致了60分,第二次改了就100了。
题目那么长那么多,就很烦,那么我们直接看向量内积就行了,因为是稀疏向量,那些是0的就可以直接不管它了,因为0乘以任何数也是0
那么我们针对u·v,先输入向量u,把和u对应的v在同一个位置上不为0的数乘起来
test data
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
输出
-20
结果1
Codes-60分
#include<iostream>
using namespace std;
struct locat{
int x,y;
};
locat l1[500001];
locat l2[500001];
int main(){
int n,a,b;//维度,u,v,坐标
cin>>n>>a>>b;
for(int i=0;i<a;i++)
cin>>l1[i].x>>l1[i].y;
int sum=0,j=0;
for(int i=0;i<b;i++){
cin>>l2[i].x>>l2[i].y;
while(j<a&&l2[i].x>l1[j].x) j++;
if(j<a&&l2[i].x==l1[j].x){
sum+=l1[j].y*l2[i].y;
j++;
}
}
cout<<sum<<endl;
return 0;
}
结果 2
Codes-100分
#include<iostream>
#define ll long long
using namespace std;
struct locat{
int x,y;
};
locat l1[500001];
locat l2[500001];
int main(){
int a,b,j=0;//维度,u,v,坐标
ll n,sum=0;
cin>>n>>a>>b;
for(int i=0;i<a;i++)
cin>>l1[i].x>>l1[i].y;
for(int i=0;i<b;i++){
cin>>l2[i].x>>l2[i].y;
while(j<a&&l2[i].x>l1[j].x) j++;
if(j<a&&l2[i].x==l1[j].x){
sum+=l1[j].y*l2[i].y;
j++;
}
}
cout<<sum<<endl;
return 0;
}