第五届蓝桥杯本科c/c++B组预赛-小朋友排队解法(归并排序求逆序数)

来源:互联网 发布:电影三部曲有哪些 知乎 编辑:程序博客网 时间:2024/04/28 05:09
#include "stdio.h" #define N 100005 int n;  struct node{     int i;        int low;       int high;  }a[N],b[N]; void Merge(node *a,int l,int r) {     if(l==r) return ;     int i,j,k,mid;     mid = (l+r)/2;     Merge(a,l,mid);     Merge(a,mid+1,r);     int tt=0;     for(i=l,j=mid+1,k=0;i<=mid && j<=r; )     {         if(a[i].i<=a[j].i)   {    a[i].low+=tt;    b[k++] = a[i++];       }         else if(a[i].i>a[j].i){             a[j].high += mid-i+1;             b[k++] = a[j];     j++;             tt++;    }                  }     while(i<=mid){      a[i].low+=tt;       b[k++] = a[i++];            }             while(j<=r)         b[k++] = a[j++];     for(i=l,j=0; i<=r; i++)         a[i] = b[j++]; }  int main() {     int i,k,w;     long long ans,t;     a[0].i=-1;  scanf("%d",&n);         for(i=1; i<=n; i++)         {             scanf("%d",&a[i].i);    a[i].high = 0;    a[i].low = 0;         }         Merge(a,1,n);           ans = 0;         for(i=1; i<=n; i++)         {             t = a[i].high + a[i].low;             ans += t*(t+1)/2;         }         printf("%I64d\n",ans);     return 0;}


 

0 0
原创粉丝点击