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 }