POJ 2299 Ultra-QuickSort(树状数组)

题目链接

说着这个题难吧,代码真的是非常裸,说简单吧,自己想了好几天,都没想出如何用树状数组。以前见过用hash的方式映射的,为什么就没想到呢。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 500001
 5 int p[N],n;
 6 struct node
 7 {
 8   __int64 x;
 9   int id;
10 }num[N];
11 int cmp(const void *a,const void *b)
12 {
13     return (*(struct node*)a).x < (*(struct node *)b).x?1:-1;
14 }
15 int lowbit(int t)
16 {
17     return (-t)&t;
18 }
19 void insert(int t)
20 {
21     while(t <= n)
22     {
23         p[t] += 1;
24         t += lowbit(t);
25     }
26 }
27 __int64 getsum(int t)
28 {
29     __int64 sum = 0;
30     while(t > 0)
31     {
32         sum += p[t];
33         t -= lowbit(t);
34     }
35     return sum;
36 }
37 int main()
38 {
39     int i;
40     __int64 sum;
41     while(scanf("%d",&n)!=EOF)
42     {
43         if(!n) break;
44         sum = 0;
45         memset(p,0,sizeof(p));
46         for(i = 0;i <= n-1;i ++)
47         {
48             scanf("%I64d",&num[i].x);
49             num[i].id = i+1;
50         }
51         qsort(num,n,sizeof(num[0]),cmp);
52         for(i = 0;i <= n-1;i ++)
53         {
54             sum += getsum(num[i].id);
55             insert(num[i].id);
56         }
57         printf("%I64d\n",sum);
58     }
59     return 0;
60 }
posted @ 2012-07-27 13:43  Naix_x  阅读(154)  评论(0编辑  收藏  举报