原题poj 2299:http://poj.org/problem?id=2299
题意,给你一个数组,去统计它们的逆序数,由于题目中说道数组最长可达五十万,那么O(n^2)的排序算法就不要再想了,接下来的选择是快排,归并,看你喜欢了
这里列出归并的解法:
#include"iostream" using namespace std; const int maxn=500000+10; int T[maxn]; int a[maxn]; long long sum; void merge_sort(int *a,int x,int y,int *T) { if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(a,x,m,T); merge_sort(a,m,y,T); while(p<m||q<y) { if(q>=y||(p<m&&a[p]<a[q])) T[i++]=a[p++]; else {sum+=m-p;T[i++]=a[q++];} } for(int i=x;i<y;i++) a[i]=T[i]; } } int main() { int n; while(cin>>n&&n) { sum=0; for(int i=0;i<n;i++) cin>>a[i]; merge_sort(a,0,n,T); /* for(int i=0;i<n;i++) cout<<a[i]<<‘ ‘; cout<<endl;*/ cout<<sum<<endl; } return 0; }
时间: 2024-12-08 20:46:11