80分代码,超时,求优化
查看原帖
80分代码,超时,求优化
681626
xxhhbb楼主2023/10/29 20:28

如题目,实际得分为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

2023/10/29 20:28
加载中...