【归并排序 逆序对 模版】
题目描述
求逆序对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 }