方法1:数(O(n^2))
只能过3/4的测试点
using namespace std;
#include<bits/stdc++.h>
const int maxn=1e5+5;
int a[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
long long sum=0;
for(int i=0;i<n-1;i++)
{
for(int j=i;j<n;j++)
{
if(a[i]>a[j]) sum++;
}
}
printf("%d",sum);
return 0;
}
方法二:归并排序(O(nlogn))
图解:
using namespace std;
#include<bits/stdc++.h>
const int maxn=1e5+5;
int a[maxn],tmp[maxn];
long long sum=0;
void mergersort(int *a,int first,int mid,int end){
int i=first,j=mid+1;
int cnt=i;
while(i<=mid && j<=end)
{
if(a[i]<a[j])
{
tmp[cnt++]=a[i++];
}
else
{
tmp[cnt++]=a[j++];
sum+=mid-i+1;
}
}
while(i<=mid) tmp[cnt++]=a[i++];
while(j<=end) tmp[cnt++]=a[j++];
for(int m=first;m<=end;m++) a[m]=tmp[m];
}
void merge(int *a,int first,int end){
if(first == end) return;
int mid=(first+end)/2;
merge(a,first,mid);
merge(a,mid+1,end);
mergersort(a,first,mid,end);
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
merge(a,1,n);
printf("%lld",sum); //long long 用lld,被这个坑了半小时,一直以为自己归并排序错了
return 0;
}