25分求助
  • 板块P1908 逆序对
  • 楼主kxbb
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/8/29 19:18
  • 上次更新2023/10/27 13:11:04
查看原帖
25分求助
359111
kxbb楼主2022/8/29 19:18
#include<bits/stdc++.h>
using namespace std;
int const N=500010;
int a[N]={};
long long ans=0;
void hb(int a1,int a2,int b1,int b2)
{
	int b[N]={};
	int lena=a1;
	int lenb=b1;
	int len=1;
	while(1)
	{
		if(lena>a2)
		{
			for(int i=lenb;i<=b2;i++)
			{
				b[len]=a[i];
				len++;
			}
			break;
		}
		if(lenb>b2)
		{
			for(int i=lena;i<=a2;i++)
			{
				b[len]=a[i];
				len++;
			}
			break;
		}
		if(a[lena]<=a[lenb])
		{
			b[len]=a[lena];
			lena++;
			len++;
		}
		else
		{
			ans+=a2-lena+1;
			b[len]=a[lenb];
			lenb++;
			len++;
		}
	}
	for(int i=a1;i<=b2;i++)//a,b 合并 
	{
		a[i]=b[i-a1+1];
	}
	return;
}
void gb(int head,int tail)
{
	if(tail-head==0)	return;
	int mid=head+tail;
	mid=mid/2;
	gb(head,mid);
	gb(mid+1,tail);
	hb(head,mid,mid+1,tail);
}
int main()
{
	int x;
	scanf("%d",&x);
	for(int i=1;i<=x;i++)
		scanf("%d",&a[i]);
	gb(1,x);
	printf("%lld",ans);
	return 0;
}
//5 4 2 6 3 1 

N改成100010就50分 莫名其妙。。

2022/8/29 19:18
加载中...