求逆序数 noj117
#include<iostream> #include<cstdio> using namespace std; #define N 1000000010 #define M 1000010 __int64 sum; //long long sum; int a[M],L[M/2+1],R[M/2+1]; void merger(int beg,int mid,int end) { // cout<<"A:"<<beg<<" "<<mid<<" "<<end<<endl; int L_len=mid-beg,R_len=end-mid-1; int i,j,k; for(i=0;i<=L_len;i++) L[i]=a[beg+i]; for(j=0;j<=R_len;j++) R[j]=a[mid+j+1]; L[L_len+1]=R[R_len+1]=N; i=j=0; for(k=beg;k<=end;k++) { if(L[i]<=R[j]) a[k]=L[i++]; else { a[k]=R[j++]; sum+=L_len-i+1; } } // for(i=0;i<=end;i++) // cout<<a[i]<<" "; // cout<<endl<<endl; } void mergerSort(int beg,int end) { int mid=(beg+end)>>1; if(beg<end) { mergerSort(beg,mid); mergerSort(mid+1,end); merger(beg,mid,end); } } int main() { // freopen("in.txt","r",stdin); int t,n; cin>>t; while(t--) { sum=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } mergerSort(0,n-1); printf("%Id64\n",sum); // printf("%lld\n",sum); } return 0; }