归并RE三个点求助!
  • 板块P1908 逆序对
  • 楼主lvyijia44
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/11/7 10:19
  • 上次更新2023/11/5 08:40:49
查看原帖
归并RE三个点求助!
183761
lvyijia44楼主2020/11/7 10:19
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;

inline int read(){
	int ans=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		ans=(ans<<3)+(ans<<1)+ch-'0';
		ch=getchar();
	}
	return ans*f;
}
inline void p(ll m){
	printf("%lld",m);
}

int n,a[maxn],rt[maxn];
ll ans;

inline void gb(int l,int r){
	if(l==r)return;
	int m=(l+r)>>1;
	gb(l,m);gb(m+1,r);
	int i=l,j=m+1,cnt=l-1;
	while(i<=m && j<=r){
		if(a[i]<=a[j])
			rt[++cnt]=a[i++];
		else rt[++cnt]=a[j++],ans+=(ll)(m-i+1);
	}
	while(i<=m)
		rt[++cnt]=a[i++];
	while(j<=r)
		rt[++cnt]=a[j++];
	for(int k=l;k<=r;k++)
		a[k]=rt[k];
	return;	
}


int main(){
	n=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	
	gb(1,n);
	
	p(ans);
	return 0; 
}
2020/11/7 10:19
加载中...