逆序对代码
2024-08-24 19:33:20
发布于:广东
7阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=3e5;
int n,a[maxn+5],b[maxn+5],cnt[maxn+5],tmp[maxn+5],temp1[maxn+5],temp2[maxn+5];
ll ans;
void msort(int l,int r){
if(l==r){
return;
}
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
for(int i=l;i<=r;i++){
cnt[b[i]]=0;
}
for(int i=l;i<=mid;i++){
cnt[b[i]]++;
}
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
cnt[b[i]]--;
tmp[k++]=i++;
}
else{
ans+=mid-i+1-cnt[b[j]];
tmp[k++]=j++;
}
}
while(i<=mid){
tmp[k++]=i++;
}
while(j<=r){
tmp[k++]=j++;
}
for(int i=l;i<=r;i++){
temp1[i]=b[i],temp2[i]=a[i];
}
for(int i=l;i<=r;i++){
a[i]=temp2[tmp[i]],b[i]=temp1[tmp[i]];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
msort(1,n);
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个