1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 long long a[500005],b[500005],ans;//a为待排序数组,b为临时数组,ans为逆序对数 
 5 void mergesort(int l,int r)//l为左边界,r为右边界 
 6 {
 7     if(l==r) return;
 8     int mid=(l+r)>>1;
 9     mergesort(l,mid);
10     mergesort(mid+1,r);
11     int i=l,j=mid+1,k=l;
12     while(i<=mid&&j<=r)
13     {
14         if(a[i]<=a[j]) b[k++]=a[i++]; //注意等号 若a[i]==a[j] 则不构成逆序对 
15         else b[k++]=a[j++],ans+=mid-i+1;//求逆序对 
16     }
17     while(i<=mid) b[k++]=a[i++];
18     while(j<=r) b[k++]=a[j++];
19     for(int i=l;i<=r;i++) a[i]=b[i];
20 }
21 int main()
22 {
23     scanf("%d",&n); 
24     while(n)
25     {
26         ans=0;
27         memset(a,0,sizeof(a));
28         memset(b,0,sizeof(b));
29         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
30         mergesort(1,n);
31         printf("%lld\n",ans);
32         scanf("%d",&n);
33     }
34     return 0;
35 }

 

相关文章:

  • 2022-12-23
  • 2021-10-06
  • 2022-12-23
  • 2021-08-29
  • 2021-09-09
  • 2021-08-08
猜你喜欢
  • 2022-01-18
  • 2021-12-03
  • 2022-01-21
  • 2021-11-16
相关资源
相似解决方案