思路:根据归并排序求逆序对,我们知道归并排序是将两个有序数列合并成一个有序数列,那么其中一个数列的x大于另外一个数列的y,那么是不是x所在数列中x及后面的都大于y。s要开long long ,最多可能有(1+100000)*100000/2个;
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int a[100005]; 5 int b[100005]; 6 long long s=0; 7 void hhh(int x,int y,int z) 8 { 9 int l=x; 10 int k=0; 11 int mid=y; 12 int l1=y+1; 13 while(l<=mid&&l1<=z) 14 { 15 if(a[l]<a[l1]) 16 b[k++]=a[l++]; 17 else 18 { 19 s+=(mid-l)+1; 20 b[k++]=a[l1++]; 21 22 } 23 } 24 while(l<=mid) 25 b[k++]=a[l++]; 26 while(l1<=z) 27 b[k++]=a[l1++]; 28 for(int i=0;i<k;i++) 29 a[x++]=b[i]; 30 } 31 void hh(int x,int y) 32 { 33 if(x==y) 34 return ; 35 hh(x,(x+y)/2); 36 hh((x+y)/2+1,y); 37 hhh(x,(x+y)/2,y); 38 } 39 40 int main() 41 { 42 scanf("%d",&n); 43 for(int i=1;i<=n;i++) 44 scanf("%d",&a[i]); 45 hh(1,n); 46 cout<<s<<endl; 47 }