hdu 3743 归并排序

来源:互联网 发布:it培训计划方案 编辑:程序博客网 时间:2024/05/19 05:29
求逆序数题目描述有点问题。归并排序。#include<stdio.h>#define N 1000005int in[N],tmp[N];__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 1000005struct node{int x,c;}a[N];int b[N],ans[N],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;}

0 0
原创粉丝点击