堆
(1)hdu 1394 Minimum Inversion Number
这题有人用线段树排序,方正算法要 n(log n) ,我就直接用堆排序来进行找逆序对的个数,因为数的大小在0~ n-1 之间,就能简单的根据它的值判断比它大的数的个数是n-a[i]-1,比它小的个数是a[i]。
View Code
#include<stdio.h> #include<string.h> #define size 5005 #define INF 100000000 int a[size],b[size]; int n,sum; void merge(int p,int q,int r) { int i,j,k; int n1,n2; int l[size/2+1],ri[size/2+1]; n1=q-p+1; n2=r-q; for(i=0;i<n1;i++) l[i]=a[p+i]; for(i=0;i<n2;i++) ri[i]=a[q+i+1]; l[n1]=INF;ri[n2]=INF; i=0;j=0; for(k=p;k<=r;k++) { if(l[i]<=ri[j]) { a[k]=l[i]; i++; } else { a[k]=ri[j]; j++; sum+=n1-i; } } } void m_sort(int p,int r) { int q; if(r-p==0) return; q=(r+p)/2; m_sort(p,q); m_sort(q+1,r); merge(p,q,r); return ; } int main() { int i; int min=INF; // freopen("test","r",stdin); while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } m_sort(1,n); min=sum; for(i=1;i<n;i++) { // printf("%d %d %d\n",i,b[i],sum); sum=sum+n-b[i]-b[i]-1; if(min>sum) min=sum; } printf("%d\n",min); } return 0; }


浙公网安备 33010602011771号