【归并排序 逆序对 模版】

题目描述

求逆序对a[i]>a[j],i<j的个数

输入

第一行n(<= 1000000)个数,第二行n个数,每个数在-1e8,1e8之间

输出

逆序对个数

样例输入

10 3 5 2 7 26 1 8 5 8 3

样例输出

18
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 const int N=1000005;
 8 int gi(){
 9     int str=0,f=1;char ch=getchar();
10     while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
11     while(ch>='0' && ch<='9')str=str*10+ch-'0',ch=getchar();
12     return str*f;
13 }
14 int a[N],temp[N];ll ans=0;
15 void deal(int l,int mid,int r)
16 {
17     int i=l,j=mid+1,m=0,len=r-l+1;
18     while(i<=mid && j<=r)
19     {
20         if(a[j]<a[i])temp[++m]=a[j++],ans+=(mid-i+1);
21         else temp[++m]=a[i++];
22     }
23     if(i>mid)while(j<=r)temp[++m]=a[j++];
24     else while(i<=mid)temp[++m]=a[i++];
25     for(int i=1;i<=len;i++)a[l+i-1]=temp[i];
26 }
27 void merge(int l,int r)
28 {
29     int mid;
30     if(l<r)
31     {
32         mid=(l+r)>>1;
33         merge(l,mid);merge(mid+1,r);
34         deal(l,mid,r);
35     }
36 }
37 int main()
38 {
39     int n=gi();
40     for(int i=1;i<=n;i++)a[i]=gi();
41     merge(1,n);
42     printf("%lld",ans);
43     return 0;
44 }
原文地址:https://www.cnblogs.com/Yuzao/p/7025815.html