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 }

你可能感兴趣的:(Quicksort)