标签:any roc ping distinct task processes else min tmp
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
题意:要求使序列变为递增序列的最小交换相邻元素的次数;
思路:归并排序求逆序数;
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> #define N 500010 typedef long long ll; using namespace std; ll a[N]; ll ans=0; ll tmp[N]; void merge_(int l,int m,int r){ int cnt=0; int i,j; for(i=l,j=m+1;i<=m&&j<=r;){ if(a[i]<=a[j]) {tmp[++cnt]=a[i]; i++;} else{ tmp[++cnt]=a[j]; j++; ans+=(m-i+1); } } while(i<=m) {tmp[++cnt]=a[i]; i++;} while(j<=r) {tmp[++cnt]=a[j]; j++;} for(i=l,j=1;i<=r&&j<=cnt;i++,j++) a[i]=tmp[j]; } void merge_sort(int l,int r){ if(l==r) return; if(l<r){ int m=(l+r)>>1; merge_sort(l,m); merge_sort(m+1,r); merge_(l,m,r); } } int main() { int n; while(scanf("%d",&n)!=EOF&&n){ for(int i=1;i<=n;i++) cin>>a[i]; ans=0; merge_sort(1,n); cout<<ans<<endl; } return 0; }
配图不是很懂啊?
标签:any roc ping distinct task processes else min tmp
原文地址:https://www.cnblogs.com/lllxq/p/9079350.html