1
思路:先分治后归并
AC代码:
#include<iostream> #include<string.h> #include<string> #define N 1000001 using namespace std; long a[N],b[N]; long long num;//尼玛的这里让我错了好几次。。。 void merge(int p,int q,int r,int s) { int a1=p,k=p,c=r; while(a1<=q&&c<=s) { if(a[a1]<=a[c]) b[k++]=a[a1++]; else{b[k++]=a[c++];num+=q-a1+1;} } if(a1>q) for(;c<=s;++c) b[k++]=a[c]; if(c>s) for(;a1<=q;++a1) b[k++]=a[a1]; for(;p<k;++p) a[p]=b[p]; } void merge_sort(int p,int r) { if(p<r) { int q=(p+r)/2; merge_sort(p,q); merge_sort(q+1,r); merge(p,q,q+1,r); } } int main() { int Case; cin>>Case; while(Case--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); num=0; int n; cin>>n; for(int i=0;i<n;++i) cin>>a[i]; merge_sort(0,n-1); cout<<num<<endl; }return 0; }