#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之后才明白 求助 谢谢大佬