相关题目:
逆序对的数量https://www.acwing.com/problem/content/790/
解题思路:
1 暴力法,直接用两个for循环就行了。
2 要用到归并排序的思想,并且每一次归并的时候,要记录逆序数的数量,归并后消除一部分逆序,随后继续归并,直到结束为止。
(消除部分逆序)举个例子,5 2变成2 5 的目的是消除5和2之间的逆序,但是和其他数的情况还是不知道的。
相关代码:
#include<iostream>
using namespace std;
int s=0;
void merge_sort(int a[],int l,int r){
if(l>=r){
return;
}
int mid=(l+r)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int i=l;
int j=mid+1;
int k=0;
int temp[100000]={0};
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
temp[k++]=a[i++];
}
else{
s=s+mid-i+1;
temp[k++]=a[j++];
}
}
while(i<=mid){
temp[k++]=a[i++];
}
while(j<=r){
temp[k++]=a[j++];
}
for(int i=l,j=0;i<=r;i++,j++){
a[i]=temp[j];
}
}
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
merge_sort(a,0,n-1);
cout<<s;
return 0;
}
补充:
不知道为什么,该代码执行时间还是超时。