HDOJ3743<分治>
题意:求一个排列的逆序数。
#include<cstdio> #include<iostream> #include<algorithm> const int maxn=1000005; int maze[maxn],temp[maxn]; long long ans; void union_set(int l,int mid,int r) { int i=l,j=mid+1,k=0; while(i<=mid&&j<=r){ if(maze[i]>maze[j]){ ans+=mid+1-i; temp[k++]=maze[j++]; } else temp[k++]=maze[i++]; } while(i<=mid)temp[k++]=maze[i++]; while(j<=r) temp[k++]=maze[j++]; for(int i=0;i<k;i++) maze[l+i]=temp[i]; } void merge_sort(int l,int r) { if(l==r)return ; int mid=(l+r)/2; merge_sort(l,mid); merge_sort(mid+1,r); union_set(l,mid,r); } int main () { int n; while(~scanf("%d",&n)) { ans=0; for(int i=0;i<n;i++) scanf("%d",&maze[i]); merge_sort(0, n-1); printf("%lld\n",ans); } return 0; }
想的太多,做的太少。