思路:(ai-bi)^2 = ai^2 +bi^2 -2aibi,ai^2和 bi^2都是准确的值,要求最小值,只需要求2*ai *bi的最大值
对于两个数列,存在规律 :有序 * 有序 > 无序 * 无序 ,所以只需要将两个数组的大小位置都按照一一对应,得到的结果就是最终所求
由于每次只可以交换相邻的数,所以也就是求逆序对
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e8-3;
int n;
struct node{
int a,b;
}a[N],b[N];
int c[N];
int cnt[N];
bool cmp(node a,node b)//离散化
{
return a.a<b.a;
}
int lowbit(int x)
{
return x&-x;
}
void add(int x,int n,int val)
{
for(int i=x;i<=n;i+=lowbit(i))
cnt[i]=(cnt[i]+val)%mod;
}
int query(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
ans=(ans+cnt[i])%mod;
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i].a),a[i].b=i;
for(int i=1;i<=n;i++) scanf("%d",&b[i].a),b[i].b=i;
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;i++)c[a[i].b]=b[i].b;
int ans=0;
for(int i=1;i<=n;i++)
{
add(c[i],n,1);
ans+=(i-query(c[i]));
ans%=mod;
}
printf("%d\n",ans);
return 0;
}