poj 2299 Ultra-QuickSort(归并排序求逆序数)
2012-08-06 11:08
274 查看
题目分析:求逆序数,,,
思路:归并排序,关键在于统计逆序数,如果arr[i]>arr[j],则,ans+=m-i+1,
代码:
思路:归并排序,关键在于统计逆序数,如果arr[i]>arr[j],则,ans+=m-i+1,
代码:
#include<iostream> #include<cstdio> using namespace std; int n; __int64 ans; int arr[1001000],arr1[1001000]; void Merge(int s,int m,int t); void MergeSort(int s,int t) { if(s==t) { arr1[s]=arr[s]; } else { int m=(s+t)/2; MergeSort(s,m); MergeSort(m+1,t); Merge(s,m,t); } } void Merge(int s,int m,int t) { int i=s,j=m+1,k=s; while(i<=m&&j<=t) { if(arr[i]<=arr[j]) { arr1[k++]=arr[i++]; } else { arr1[k++]=arr[j++]; ans+=m-i+1;//注意这,,,arr[i]>arr[j],则从arr[i]到arr[m]都是逆序数 } } if(i<=m) while(i<=m) { arr1[k++]=arr[i++]; //ans++; } else while(j<=t) arr1[k++]=arr[j++]; for(int p=s;p<=t;p++) arr[p]=arr1[p]; } int main() { while(scanf("%d",&n)!=EOF&&n!=0) { for(int i=1;i<=n;i++) scanf("%d",&arr[i]); ans=0; MergeSort(1,n); /*for(int i=1;i<=n;i++) printf("%d ",arr[i]); printf("\n");*/ printf("%I64d\n",ans); } //system("pause"); return 0; }
相关文章推荐
- POJ 2299 Ultra-QuickSort (归并排序、逆序数)
- POJ 2299 Ultra-QuickSort (归并排序求逆序数)
- POJ 2299 Ultra-QuickSort【求逆序数:归并排序|树状数组】
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
- poj 2299 Ultra-QuickSort 归并排序(求逆序数模板)
- poj 2299 Ultra-QuickSort (归并排序,逆序数)
- POJ 2299 Ultra-QuickSort(归并排序求逆序数)
- POJ 2299 Ultra-QuickSort (求逆序数:离散化+树状数组或者归并排序求逆序数)
- poj(2299)——Ultra-QuickSort(归并排序求逆序数)
- Poj 2299 Ultra-QuickSort(归并排序求逆序数)
- Poj 2299 Ultra-QuickSort(归并排序求逆序数)
- poj-2299 Ultra—QuickSort(归并排序求逆序数)
- POJ2299-Ultra-QuickSort (归并排序求逆序数)
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
- poj 2299 Ultra-QuickSort (归并排序 求逆序数)
- POJ 2299-Ultra-QuickSort(归并排序求相邻元素的交换次数)
- POJ 2299 Ultra-QuickSort ---归并排序 求逆序
- POJ 2299 Ultra-QuickSort 求逆序数 树状数组
- POJ 2299 Ultra-QuickSort【归并排序】
- POJ 2299 Ultra-QuickSort(树状数组+离散化 或 归并排序求逆序)