归并排序求逆序对
#include <iostream> #include <string> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1000+100; int a[maxn]; int temp[maxn]; int t,n; int ans; void merger(int l,int m,int r) { int i=l; int j=m+1; int k=i; while(i<=m&&j<=r) { if(a[i]>a[j]) { temp[k++]=a[j++]; ans+=m+1-i; } else { temp[k++]=a[i++]; } } while(i<=m) temp[k++]=a[i++]; while(j<=r) temp[k++]=a[j++]; for(int i=l;i<=r;i++) a[i]=temp[i]; } void merge_sort(int l,int r) { if(l<r) { int m=(l+r)>>1; merge_sort(l,m); merge_sort(m+1,r); merger(l,m,r); } } int main() { scanf("%d",&t); for(int cc=1;cc<=t;cc++) { if(cc!=1) printf("\n"); ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); merge_sort(1,n); printf("Scenario #%d:\n%d\n",cc,ans); } return 0; }