Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 38258 | Accepted: 13784 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
1 //离散化+树状数组 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #define maxn 500000 6 struct node 7 { 8 int val; 9 int id; 10 }; 11 node stu[maxn+5]; 12 int n; 13 __int64 cnt; 14 int bb[maxn+5]; 15 int lowbit(int x) 16 { 17 return x&(-x); 18 } 19 void ope(int x) 20 { 21 while(x<=n) 22 { 23 bb[x]++; 24 x+=lowbit(x); 25 } 26 } 27 int sum(int x) 28 { 29 int ans=0; 30 while(x>0) 31 { 32 ans+=bb[x]; 33 x-=lowbit(x); 34 } 35 return ans; 36 } 37 int cmp(const void *a ,const void *b) 38 { 39 return (*(node *)a).val -(*(node *)b).val; 40 } 41 int main() 42 { 43 int i; 44 while(scanf("%d",&n),n) 45 { 46 memset(bb,0,sizeof(int)*(n+1)); 47 for(i=0;i<n;i++) 48 { 49 scanf("%d",&stu[i].val); 50 stu[i].id=i+1; 51 } 52 qsort(stu,n,sizeof(stu[0]),cmp); 53 cnt=0; 54 for(i=0;i<n;i++) 55 { 56 cnt+=sum(n)-sum(stu[i].id); 57 ope(stu[i].id); 58 } 59 printf("%I64d\n",cnt); 60 } 61 return 0; 62 }
归并排序:
代码:
1 //归并排序求逆序数 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #define maxn 500000 6 int cc[maxn+5]; 7 int aa[maxn+5]; 8 __int64 cnt; 9 void merge(int low ,int mid,int hig) 10 { 11 int i,j,k; 12 i=low; 13 j=mid; 14 k=0; 15 while(i<mid&&j<hig) 16 { 17 if(aa[i]>aa[j]) 18 { 19 cc[k++]=aa[j++]; 20 cnt+=mid-i; 21 } 22 else 23 cc[k++]=aa[i++]; 24 } 25 while(i<mid) 26 cc[k++]=aa[i++]; 27 while(j<hig) 28 cc[k++]=aa[j++]; 29 for(k=0,i=low;i<hig;i++) 30 aa[i]=cc[k++]; 31 } 32 void merge_sort(int st,int en) 33 { 34 int mid; 35 if(st+1<en) 36 { 37 mid=st+(en-st)/2; 38 merge_sort(st,mid); 39 merge_sort(mid,en); 40 merge(st,mid,en); 41 } 42 } 43 int main() 44 { 45 int n,i; 46 while(scanf("%d",&n),n) 47 { 48 cnt=0; 49 for(i=0;i<n;i++) 50 scanf("%d",aa+i); 51 merge_sort(0,n); 52 printf("%I64d\n",cnt); 53 } 54 return 0; 55 }
非递归归并排序:
代码:
1 //归并排序求逆序数 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #define maxn 500000 6 int cc[maxn+5]; 7 int aa[maxn+5]; 8 __int64 cnt; 9 void merge(int low ,int mid,int hig) 10 { 11 int i,j,k; 12 i=low; 13 j=mid; 14 k=0; 15 while(i<mid&&j<hig) 16 { 17 if(aa[i]>aa[j]) 18 { 19 cc[k++]=aa[j++]; 20 cnt+=mid-i; 21 } 22 else 23 cc[k++]=aa[i++]; 24 } 25 while(i<mid) 26 cc[k++]=aa[i++]; 27 while(j<hig) 28 cc[k++]=aa[j++]; 29 for(k=0,i=low;i<hig;i++) 30 aa[i]=cc[k++]; 31 } 32 //void merge_sort(int st,int en) 33 //{ 34 // int mid; 35 // if(st+1<en) 36 // { 37 // mid=st+(en-st)/2; 38 // merge_sort(st,mid); 39 // merge_sort(mid,en); 40 // merge(st,mid,en); 41 // } 42 //} 43 void merge_sort(int st,int en) 44 { 45 int s,t,i; 46 t=1; 47 while(t<=(en-st)) 48 { 49 s=t; 50 t<<=1; 51 i=st; 52 while(i+t<=en) 53 { 54 merge(i,i+s,i+t); 55 i+=t; 56 } 57 if(i+s<en) 58 merge(i,i+s,en); 59 } 60 if(i+s<en) 61 merge(i,i+s,en); 62 } 63 int main() 64 { 65 int n,i; 66 while(scanf("%d",&n),n) 67 { 68 cnt=0; 69 for(i=0;i<n;i++) 70 scanf("%d",aa+i); 71 merge_sort(0,n); 72 printf("%I64d\n",cnt); 73 } 74 return 0; 75 }