/* * POJ_2299.cpp * * Created on: 2013年11月1日 * Author: Administrator */ #include <iostream> #include <cstdio> using namespace std; const int maxn = 500010; typedef long long lolo;//这里不要使用int,因为a[i]的范围达到了999999999。在最坏的情况下,需要交换的次数已经不是int类型的数所能表示的了 lolo a[maxn],t[maxn]; lolo ans; //归并排序..归并排序是分治思想的一个典型的应用 void my_sort(lolo l , lolo r){ if(l == r){ return ; } lolo mid = (l+r)/2; my_sort(l,mid); my_sort(mid+1,r); lolo i = l,j = mid+1,now = 0; while(i <= mid && j <= r){ if(a[i] > a[j]){ ans += (mid - i + 1);//当a[i]>a[j]时,a[i]后面的数都能与a[j]形成逆序对 t[++now] = a[j++]; }else{ t[++now] = a[i++]; } } while(i <= mid){ t[++now] = a[i++]; } while(j <= r){ t[++now] = a[j++]; } now = 0; for(i = l ; i <= r ; ++i){//将临时数组t[]中的数组复制到a[]数组中 a[i] = t[++now]; } } int main(){ lolo n; while(scanf("%lld",&n)!=EOF,n){ ans = 0; lolo i; for(i = 1 ; i <= n ;++i){ scanf("%lld",&a[i]); } my_sort(1,n); printf("%lld\n",ans); } return 0; }
本题如果使用搜索的思想来做,那么时间复杂度将达到o(n^2),因为给的数很大,这是很可能会TLE,所以我们需要摆脱搜索的思想,采用分治的方法来做...............