如题目,实际得分为80,但是最后两个点超时了
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int MOD=1e8-3;
long long x[N],tmp[N],n,ans;
struct edge
{
int num;
int pos;
}a[N],b[N];
bool cmp(edge x,edge y)
{
return x.num<y.num;
}
void msort(int l,int r)
{
memset(tmp,0,sizeof(tmp));
if(l>=r)
{
return ;
}
int mid=(l+r)>>1;
msort(l,mid);
msort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)
{
if(x[i]<=x[j])
{
tmp[k]=x[i];
k++;
i++;
}
else
{
tmp[k]=x[j];
k++;
j++;
ans=(ans+mid-i+1)%MOD;
}
}
while(i<=mid)
{
tmp[k]=x[i];
k++;
i++;
}
while(j<=r)
{
tmp[k]=x[j];
k++;
j++;
}
for(int i=l;i<=r;i++)
{
x[i]=tmp[i];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].num;
a[i].pos=i;
}
for(int i=1;i<=n;i++)
{
cin>>b[i].num;
b[i].pos=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].pos]=a[i].pos;
}
msort(1,n);
cout<<ans%MOD;
return 0;
}
容易看出归并排序和sort的时间复杂度都是 O(nlogn)的,希望有大佬能帮忙优化 https://www.luogu.com.cn/record/132340944