题目
题解
–这道题其实不是看起来这么麻烦的
首先,要使火柴棒之间的距离最小,很容易证明就是根据大小顺序排序过后一一对应的情况
现在我们sort两遍,求出对应关系,再像冒泡一样进行交换就行
但是细心观察可以发现,需要进行交换的次数其实就是逆序对,非常之玄学了对吧
毕竟我们最终的目的是达到有序,需要交换的就是逆序对
就能把代码写出来了
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
const int mod=99999997;
int n;
struct hehe{
int x;
int y;
}a[MAXN],b[MAXN];
int c[MAXN],d[MAXN];
long long ans;
bool comp(const hehe &a,const hehe &b){
return a.x<b.x;
}
void msort(int l,int r){
if(l==r)
return ;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(c[i]<c[j])
d[k++]=c[i++];
else{
d[k++]=c[j++];
ans=(ans+mid-i+1)%mod;
}
}
while(i<=mid)
d[k++]=c[i++];
while(j<=r)
d[k++]=c[j++];
for(int i=l;i<=r;i++)
c[i]=d[i];
}
int main(){
// freopen("match.in","r",stdin);
// freopen("match.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i].x);
a[i].y=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i].x);
b[i].y=i;
}
sort(a+1,a+1+n,comp);
sort(b+1,b+1+n,comp);
for(int i=1;i<=n;i++)
c[a[i].y]=b[i].y;
msort(1,n);
cout<<ans%mod;
return 0;
}