hdu 3743 归并排序
2014-08-17 19:58
218 查看
求逆序数 题目描述有点问题。归并排序。 #include<stdio.h> #define N 1000005 int in ,tmp ; __int64 s; void merge(int l,int mid,int r) { int i,j,k; i=l;j=mid+1;k=1; while(i<=mid&&j<=r) { if(in[j]<in[i]) { tmp[k++]=in[j]; j++; s+=mid-i+1; } else { tmp[k++]=in[i]; i++; } } while(i<=mid) tmp[k++]=in[i++]; while(j<=r) tmp[k++]=in[j++]; k=1; for(i=l;i<=r;i++) { in[i]=tmp[k]; k++; } } void mergesort(int l,int r) { if(l<r) { int mid=(l+r)>>1; mergesort(l,mid); mergesort(mid+1,r); merge(l,mid,r); } } int main() { int n,i; while(scanf("%d",&n)!=EOF) { s=0; for(i=0;i<n;i++) scanf("%d",&in[i]); mergesort(0,n-1); printf("%I64d\n",s); } return 0; } 树状数组加离散化 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1000005 struct node { int x,c; }a ; int b ,ans ,n; int cmp(struct node a,struct node b) { return a.c<b.c; } int lowbit(int x) { return x&(-x); } void update(int x,int num) { while(x) { ans[x]+=num; x-=lowbit(x); } } __int64 sum(int x) { __int64 s=0; while(x<=n) { s+=ans[x]; x+=lowbit(x); } return s; } int main() { int i; __int64 s; while(scanf("%d",&n)!=EOF) { memset(ans,0,sizeof(ans)); for(i=1;i<=n;i++) { scanf("%d",&a[i].c); a[i].x=i; } sort(a+1,a+n+1,cmp); for(i=1;i<=n;i++) b[a[i].x]=i; s=0; for(i=1;i<=n;i++) { update(b[i],1); s+=sum(b[i])-1; } printf("%I64d\n",s); } return 0; }
相关文章推荐
- HDU 3743 (归并排序模板题)POJ 2299
- 归并排序 hdu 3743
- HDU 3743 Frosh Week (归并排序)
- POJ 2299 && HDU 3743 归并排序
- HDU 3743 Frosh Week(树状数组或归并排序求逆序)
- HDU 3743 Frosh Week(归并排序求逆序对)
- 分治算法(归并排序、一维点对、HDU-1007)
- HDU 1394 Minimum Inversion Number( 归并排序 & 线段树 )
- HDU 2689 Sort it 归并排序求逆序对
- HDU 3743 Frosh Week 【归并排序模板题】
- HDU-3743 Minimum Sum,划分树模板
- HDU 1394 Minimum Inversion Number (归并排序 | 线段树 | 数状数组)
- 【归并排序】【逆序数】HDU 5775 Bubble Sort
- HDU 3743 Frosh Week(逆序对-BIT)
- HDU 4911 Inversion (归并排序求逆序对)
- HDU - 3743 Frosh Week(树状数组+离散化)
- HDU 4911 Inversion(归并排序求逆序数)
- HDU 1394 线段树 || 归并排序
- HDU 3743 Frosh Week 树状数组
- hdu 4911 Inversion (归并排序)