逆序对求助 归并模板题 50分
  • 板块题目总版
  • 楼主zhimeng_LQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/10/15 22:45
  • 上次更新2023/11/5 10:41:08
查看原帖
逆序对求助 归并模板题 50分
321605
zhimeng_LQ楼主2020/10/15 22:45
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5*1e5;

int n;
int num[maxn];

int MergeAccount(int a[] , int left , int mid , int right);
int guibing(int arr[] , int left,int right){
	int mid = left+((right-left)>>1);
	int count = 0;
	if(left<right){
		count+= guibing(arr , left , mid);
		count+= guibing(arr , mid+1 , right);
		count+=MergeAccount(arr , left , mid , right);
	} 
	return count;
}
inline int MergeAccount(int a[] , int left , int mid , int right){
	int count = 0;
	int len1 = mid-left+1 , len2 = right-mid; //左右区间长度
	
	int al[len1],ar[len2]; //clone
	
	for(int i=0;i<len1;i++)al[i] = a[left+i];
	for(int i=0;i<len2;i++)ar[i] = a[mid+1+i];
	
	int i=0,j=0;
	for(int k=left;k<=right;k++){
		if(i>=len1){
			a[k] = ar[j];
			j++;
		}else if(j>=len2){
			a[k] = al[i];
			i++;
		}else if(al[i]>ar[j]){
			a[k] =al[i];
			i++;
			count+=len2 - j;
		}else {
			a[k] = ar[j];
			j++;
		}
	}
	return count;
}
inline int read()
{
	int x=0,neg=1;char op=getchar();
	while(!isdigit(op)){if(op=='-')neg=-1;op=getchar();}
	while(isdigit(op)){x=(x<<3)+(x<<1)+op-'0';op=getchar(); }
	return neg*x;
}
inline void print(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>=10)print(x/10);
	putchar(x%10 +'0');
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++){
		num[i]=read();
		//归并排序法
	} 
	print(guibing(num , 1 , n));
	return 0;
}

不知道啥问题 怕不是ac之后才明白 求助 谢谢大佬

2020/10/15 22:45
加载中...