传送门
我们记录a和b中每个数字出现的次数,因为相同的数字开方所得的结果是相同的,没有必要反复求。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],b[N],ca[30*N],cb[30*N];
typedef pair<int,int> pII;
vector<pII>va,vb;
//long long ans;
long long getsq(int a,int b)
{
return (floor)(sqrt(abs(b-a)));
}
int main()
{
long long i,j,k,m,n;
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(i=1; i<=n; i++)
{
cin>>a[i];
ca[a[i]]++;
}
for(i=1; i<=n; i++)
{
cin>>b[i];
cb[b[i]]++;
}
for(i=0; i<=3000000; i++)//题目中给了a数组和b数组的范围,
{
if(ca[i])
va.push_back({i,ca[i]});
if(cb[i])
vb.push_back({i,cb[i]});
}
long long ans=0;
for(auto i:va)
{
for(auto j:vb)
{
ans+=(long long)i.second*(long long)j.second*getsq(i.first,j.first);
}
}
cout<<ans<<endl;
}