POJ 2299 Ultra-QuickSort

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 }
posted @ 2012-09-21 20:49  YORU  阅读(172)  评论(0)    收藏  举报