思路
稍微用点群论的知识,我们可以感觉出它要我们求逆序对。
于是我们可以先把a和b的数字和离散化结果记录下来,然后用x存储置换后的结果,
然后套个归并排序的板子就OK啦。
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+7; const int mod=1e8-3; struct node{ int num,id; }a[maxn],b[maxn]; int n,x[maxn],t[maxn],ans; bool cmp(node a,node b){ return a.num<b.num; } void mergesort(int l,int r){ if(l==r) return; // cout<<l<<" "<<r<<endl; int mid=l+r>>1; mergesort(l,mid); mergesort(mid+1,r); int k=0,i=l,j=mid+1; while(i<=mid&&j<=r){ if(x[i]<=x[j]) t[k++]=x[i++]; else{ ans=(ans+mid-i+1)%mod; t[k++]=x[j++]; } } while(i<=mid) t[k++]=x[i++]; while(j<=r) t[k++]=x[j++]; for(int p=l,q=0;p<=r;p++,q++) x[p]=t[q]; } signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].num; a[i].id=i; } for(int i=1;i<=n;i++){ cin>>b[i].num; b[i].id=i; } sort(a+1,a+1+n,cmp); sort(b+1,b+1+n,cmp); for(int i=1;i<=n;i++) x[b[i].id]=a[i].id; mergesort(1,n); cout<<ans<<endl; return 0; }