http://poj.org/problem?id=2299
看到题目想到的就是归并排序....然后文哥告诉我是树状数组,等下再去看看树状数组怎么写,会可以求出逆序对。
View Code
1 #include <iostream> 2 using namespace std; 3 const int maxn = 500005; 4 long ans[maxn],fark[maxn]; 5 long long temp; 6 void merge(int p,int q,int r) 7 { 8 int i,j,l; 9 i=p; 10 j=q+1; 11 l=p; 12 while(i<=q && j<=r) 13 { 14 if(ans[i]<=ans[j]) 15 fark[l++]=ans[i++]; 16 else 17 { 18 fark[l++]=ans[j++]; 19 temp+=q-i+1; 20 } 21 } 22 while(i<=q) 23 { 24 fark[l++]=ans[i++]; 25 } 26 while(j<=r) 27 { 28 fark[l++]=ans[j++]; 29 } 30 for(i=p;i<=r;i++) 31 ans[i]=fark[i]; 32 } 33 void sort_merge(int p,int r) 34 { 35 int q; 36 if(p<r) 37 { 38 q=(p+r)/2; 39 sort_merge(p,q); 40 sort_merge(q+1,r); 41 merge(p,q,r); 42 } 43 } 44 int main() 45 { 46 int n,i; 47 while(cin>>n,n) 48 { 49 for(i=0;i<n;i++) 50 cin>>ans[i]; 51 temp=0; 52 sort_merge(0,n-1); 53 cout<<temp<<endl; 54 } 55 return 0; 56 }